Index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. <template>
  2. <div id="yyjg">
  3. <EntInfo
  4. v-if="entInfoShow"
  5. :ent-data="currentEnt.value"
  6. @closeEntInfo="handleCloseEntInfo"
  7. @closeUnitVedio="ue_closeUnitVedio"
  8. @onVideoShow="handleOnVideoShow"
  9. />
  10. <BoatInfo v-if="boatInfoShow"
  11. :boatTypeForClick="boatTypeForClick"
  12. @closeBoatInfoYunXing="handleCloseBoatInfoYunXing"
  13. />
  14. <UnitJYXK v-if="unitXuKeListShow"
  15. :unitWarningType="unitWarningType"
  16. @closeUnitXuKe="handlecloseUnitXuKe"
  17. />
  18. <danger-list v-if="dangerListShow" @close="dangerListShow=false"/>
  19. <div class="panel-left" :class="{'is-hide': aside_hide}">
  20. <div class="pl-b1">
  21. <span class="title1-left">企业概况</span>
  22. <ul class="plb1-content">
  23. <li v-for="item in listData_qygk.data" @click="handleOpenEntList(item)">
  24. <img :src="item.icon" alt="">
  25. <div>
  26. <span>{{ item.showName||item.name }}</span>
  27. <span>{{item.count}}</span>
  28. </div>
  29. </li>
  30. </ul>
  31. </div>
  32. <EntInfoList
  33. :list-data="listData_entInfo.current"
  34. :is-warning="false"
  35. :has-detail="isEntListHasDetail"
  36. v-show="entInfoListShow"
  37. @closeEntList="handleCloseEntList"
  38. @pickedEnt="ent => handlePickedEnt(ent)"
  39. />
  40. <div class="pl-b2">
  41. <span class="title1-left">港口作业申报</span>
  42. <span class="title2-left">危货监测</span>
  43. <div v-for="item in listData_zysb.danger" class="list-item-danger">
  44. <img src="@/assets/imgs/page_yyjg/box-weihuo.png" alt="">
  45. <div>
  46. <div>
  47. <span>{{ item.count }}</span>
  48. <span>{{ item.unit }}</span>
  49. </div>
  50. <span>{{ item.name }}</span>
  51. </div>
  52. </div>
  53. <span class="title2-left">普货监测</span>
  54. <div v-for="item in listData_zysb.normal" class="list-item-normal">
  55. <img src="@/assets/imgs/page_yyjg/box-puhuo.png" alt="">
  56. <div>
  57. <div>
  58. <span>{{ item.count }}</span>
  59. <span>{{ item.unit }}</span>
  60. </div>
  61. <span>{{ item.name }}</span>
  62. </div>
  63. </div>
  64. </div>
  65. </div>
  66. <div class="panel-right" :class="{'is-hide': aside_hide}">
  67. <EntInfoList
  68. :list-data="listData_cdjkb.ent"
  69. :is-warning="true"
  70. v-show="entWarningListShow"
  71. :has-detail="true"
  72. @closeEntList="handleCloseWarningEnt"
  73. @pickedEnt="ent => handlePickWarningEnt(ent)"
  74. />
  75. <WarningShipList v-show="shipWarningListShow" :list-data="listData_cdjkb.ship" @close-list="handleCloseWarningShip" />
  76. <div class="pr pr-b1">
  77. <span class="title1-right">港口危货作业监测</span>
  78. <div class="prb1-option">
  79. <label><input type="radio" name="isFinish" :value="0" v-model="dangerIsFinish"/>未完工</label>
  80. <label><input type="radio" name="isFinish" :value="1" v-model="dangerIsFinish"/>已完工</label>
  81. <span @click="showDangerList">查看全部</span>
  82. </div>
  83. <div class="prb1-main">
  84. <ul class="prb1-list" id="prb1List" v-show="listData_zxjc.data.length>2">
  85. <li v-for="item,index in listData_zxjc.data" class="prb1-main-item">
  86. <i></i>
  87. <div>
  88. <div>
  89. <span>{{ item.shipName }}</span>
  90. <!-- <span>{{ item.state }}</span> -->
  91. </div>
  92. <span>{{ item.startTime.slice(5,16) + ' ~ ' + item.endTime.slice(5,16) }}</span>
  93. <div>
  94. <div>
  95. <span>货物: </span>
  96. <span :title="item.cargoName">{{ item.cargoName }}</span>
  97. </div>
  98. <div>
  99. <span>申报量(吨): </span>
  100. <span>{{ item.declareTon }}</span>
  101. </div>
  102. </div>
  103. </div>
  104. </li>
  105. </ul>
  106. <ul class="prb1-list" v-show="listData_zxjc.data.length!==0&&listData_zxjc.data.length<3">
  107. <li v-for="item,index in listData_zxjc.data" class="prb1-main-item">
  108. <i></i>
  109. <div>
  110. <div>
  111. <span>{{ item.shipName }}</span>
  112. </div>
  113. <span>{{ item.startTime.slice(5,16) + ' ~ ' + item.endTime.slice(5,16) }}</span>
  114. <div>
  115. <div>
  116. <span>货物: </span>
  117. <span :title="item.cargoName">{{ item.cargoName }}</span>
  118. </div>
  119. <div>
  120. <span>申报量(吨): </span>
  121. <span>{{ item.declareTon }}</span>
  122. </div>
  123. </div>
  124. </div>
  125. </li>
  126. </ul>
  127. <span v-show="listData_zxjc.data.length===0" class="prb1-empty">无数据</span>
  128. </div>
  129. </div>
  130. <div class="pr pr-b2">
  131. <span class="title1-right">运行动态</span>
  132. <div class="prb2-main">
  133. <div v-for="item in cataData_yxdt.data">
  134. <span>{{ item.value }}</span>
  135. <span>艘次</span>
  136. <i @click="clickYunXingDongTaiDetial(item.fieldName)"></i>
  137. <div><i></i><span>{{ item.title }}</span></div>
  138. </div>
  139. </div>
  140. </div>
  141. <div class="pr pr-b3">
  142. <span class="title1-right">违规告警</span>
  143. <div class="prb3-item" v-for="item in listData_wggj.data">
  144. <i></i>
  145. <div>
  146. <span>{{ item.type }}</span>
  147. <div v-if="'value_ent' in item">
  148. <span>船舶</span>
  149. <span class="value-boat" @click="handleOpenWarningShip">{{ item.value }}</span>
  150. <span>企业</span>
  151. <span class="value-ent" @click="handleOpenWarningEnt">{{ item.value_ent }}</span>
  152. </div>
  153. <span v-else class="value-boat" @click="handleOpenUnitXuKe(item.fieldName)">{{ item.value }}</span>
  154. </div>
  155. </div>
  156. </div>
  157. </div>
  158. </div>
  159. </template>
  160. <script>
  161. export default {
  162. name: 'YyjgHome',
  163. }
  164. </script>
  165. <script setup>
  166. import { onMounted, reactive, nextTick, ref, computed, onBeforeUnmount, watch } from 'vue';
  167. import EntInfoList from './cpns/EntInfoList'
  168. import EntInfo from './cpns/EntInfo'
  169. import BoatInfo from './cpns/BoatInfo'
  170. import UnitJYXK from './cpns/UnitJYXK'
  171. import { GetQygk, GetYxdt, GetZysb, GetZxjc, GetWggj, GetQylb, GetQywggj, GetCbwgyj } from '@/apis/yyjg'
  172. import WarningShipList from './cpns/WarningShipList.vue';
  173. import DangerList from './cpns/DangerList.vue'
  174. import bus from '@/utils/bus';
  175. import {
  176. ueCallCloseUnitWiget, ueCallCloseUnitVedio, ueCallClickUnitWiget, ueCallOpenUnitWiget, ueCallBreathGetPoint, ueCallClickBreth, ueCallClearAllBreth,
  177. ueCallShowSuperLevelBoat, ueCallCloseSuperLevelBoat
  178. } from '@/utils/UIInteractions'
  179. import { useRafFn } from '@vueuse/core'
  180. import { asideShow } from '@/store/index'
  181. import {locationUnit} from "@/utils/map/OperationSupervision";
  182. const aside_hide = asideShow().isHide
  183. let timer
  184. bus.on('ueRec_closeUnitVideo', (data) => {
  185. if(data.isOk=='true') {
  186. entInfoListShow.value=true
  187. entInfoShow.value=true
  188. }
  189. })
  190. onMounted(() => {
  191. getData()
  192. })
  193. onBeforeUnmount(() => {
  194. clearInterval(timer)
  195. bus.off('ueRec_closeUnitVideo')
  196. })
  197. function getData() {
  198. getData_qygk()
  199. getData_yxdt()
  200. getData_zysb()
  201. getData_wggj()
  202. getData_zxjc(dangerIsFinish.value, 999, 1)
  203. timer = setInterval(() => {
  204. getData_zxjc(dangerIsFinish.value, 999, 1)
  205. }, 120000);
  206. }
  207. const listData_qygk = reactive({data: [
  208. { name: '港口经营企业', count: 0, icon: require('../../assets/imgs/page_yyjg/icon-gkjy.png') },
  209. { name: '港口经营备案企业', count: 0, icon: require('../../assets/imgs/page_yyjg/icon-gkjy.png') },
  210. ]})
  211. function getData_qygk() {
  212. GetQygk().then(res => {
  213. res.data.Rows.forEach(i => {
  214. listData_qygk.data.forEach(j => {
  215. if(i.certtype === j.name) {
  216. j.count = i.id
  217. }
  218. })
  219. })
  220. })
  221. }
  222. const entInfoListShow = ref(false)
  223. function handleCloseEntList() {
  224. locationUnit(null,false)
  225. entInfoListShow.value=false
  226. if(!entInfoShow.value) {
  227. // ue_closeUnitVedio()
  228. ue_closeUnitWiget()
  229. }
  230. }
  231. function handleCloseEntInfo() {
  232. locationUnit(null,false)
  233. entInfoShow.value=false
  234. if(!entInfoListShow.value) {
  235. // ue_closeUnitVedio()
  236. ue_closeUnitWiget()
  237. }
  238. }
  239. function handleCloseBoatInfoYunXing() {
  240. boatInfoShow.value=false
  241. // if(!boatInfoShow.value) {
  242. // ue_closeUnitWiget()
  243. // }
  244. }
  245. function handlecloseUnitXuKe() {
  246. unitXuKeListShow.value=false
  247. // if(!boatInfoShow.value) {
  248. // ue_closeUnitWiget()
  249. // }
  250. }
  251. function handleOnVideoShow() {
  252. setTimeout(() => {
  253. entInfoListShow.value=false
  254. entInfoShow.value=false
  255. }, 500);
  256. }
  257. function ue_closeUnitWiget() {
  258. ueCallCloseUnitWiget()
  259. }
  260. function ue_closeUnitVedio() {
  261. ueCallCloseUnitVedio()
  262. }
  263. function getData_qylb(companyType, id, type) {
  264. GetQylb(companyType, id).then(res => {
  265. listData_entInfo.current = listData_entInfo[type] = res.data.Rows
  266. })
  267. }
  268. const entInfoShow = ref(false)
  269. const currentEnt = reactive({value: {}})
  270. const boatTypeForClick = reactive({type:""})
  271. const unitWarningType = reactive({type:""})
  272. function handlePickedEnt(ent) {
  273. // console.log(ent)
  274. entInfoShow.value = false
  275. currentEnt.value = ent
  276. ueCallClickUnitWiget(ent.objectId)
  277. setTimeout(() => {
  278. entInfoShow.value = true
  279. }, 1000);
  280. }
  281. const isEntListHasDetail = ref(false)
  282. const listData_entInfo = reactive({
  283. current: [],
  284. '港口经营企业': [],
  285. '港口经营备案企业': [],
  286. '水路运输管理企业': []
  287. })
  288. function handleOpenEntList(item) {
  289. if(listData_entInfo[item.name].length===0) {
  290. let companyType; let id
  291. switch(item.name) {
  292. case '港口经营企业':
  293. id=1; companyType=1
  294. break
  295. case '港口经营备案企业':
  296. id=10; companyType=1
  297. break
  298. case '水路运输管理企业':
  299. id=5; companyType=2
  300. break
  301. }
  302. getData_qylb(companyType, id, item.name)
  303. } else {
  304. listData_entInfo.current = listData_entInfo[item.name]
  305. }
  306. if(item.name==="港口经营企业") {
  307. ueCallOpenUnitWiget()
  308. isEntListHasDetail.value = true
  309. } else {
  310. isEntListHasDetail.value = false
  311. }
  312. entInfoListShow.value = true
  313. }
  314. function getData_zysb() {
  315. GetZysb().then(res => {
  316. listData_zysb.normal[0].count = res.data['commonCount']
  317. listData_zysb.danger[0].count = res.data['dangerCount']
  318. if(Math.round(+res.data['commonTon']).toString().length<5) {
  319. listData_zysb.normal[1].count = res.data['commonTon']
  320. listData_zysb.normal[1].unit = '吨'
  321. } else {
  322. listData_zysb.normal[1].count = (+res.data['commonTon']/10000).toFixed(2)
  323. listData_zysb.normal[1].unit = '万吨'
  324. }
  325. if(Math.round(+res.data['dangerTon']).toString().length<5) {
  326. listData_zysb.danger[1].count = res.data['dangerTon']
  327. listData_zysb.danger[1].unit = '吨'
  328. } else {
  329. listData_zysb.danger[1].count = (+res.data['dangerTon']/10000).toFixed(2)
  330. listData_zysb.danger[1].unit = '万吨'
  331. }
  332. })
  333. }
  334. const listData_zysb = reactive({
  335. normal: [
  336. { name: '当天货物装卸申报数', count: 0, unit: '艘' },
  337. { name: '当天散货装卸吞吐量', count: 0, unit: '吨' }
  338. ],
  339. danger: [
  340. { name: '当天危货装卸申报数', count: 0, unit: '艘' },
  341. { name: '当天危货装卸吞吐量', count: 0, unit: '吨' },
  342. ]
  343. })
  344. let isDangerScrolling = false
  345. let dangerPauseFn
  346. let dangerResumeFn
  347. function dangerListScroll() {
  348. const dangerList = document.getElementById('prb1List')
  349. let itemH = dangerList.clientHeight / Math.ceil(listData_zxjc.data.length) * 2
  350. const { pause, resume } = useRafFn(() => {
  351. if(Math.abs(dangerList.style.top.slice(0, -2)) >= itemH) {
  352. dangerList.style.top = 0
  353. let dangerListTemp = [...listData_zxjc.data]
  354. for(let i=0; i<2; i++) {
  355. dangerListTemp.push(dangerListTemp.shift())
  356. }
  357. listData_zxjc.data = dangerListTemp
  358. }
  359. dangerList.style.top = (Number(dangerList.style.top.slice(0, -2)) - 0.7) + 'px'
  360. })
  361. dangerList.onmouseenter = pause
  362. dangerList.onmouseleave = resume
  363. dangerPauseFn = pause
  364. dangerResumeFn = resume
  365. }
  366. function getData_zxjc(isFinish, size, index) {
  367. GetZxjc(isFinish, size, index).then(res => {
  368. listData_zxjc.data = res.data?.Rows || []
  369. if(isDangerScrolling) {
  370. if(listData_zxjc.data.length<3) {
  371. dangerPauseFn()
  372. }else {
  373. dangerResumeFn()
  374. }
  375. } else {
  376. if(listData_zxjc.data.length===0) { return }
  377. nextTick(() => {
  378. dangerListScroll()
  379. isDangerScrolling = true
  380. })
  381. }
  382. })
  383. }
  384. const dangerIsFinish = ref(0)
  385. watch(dangerIsFinish, (val)=> {
  386. getData_zxjc(dangerIsFinish.value, 999, 1)
  387. })
  388. const dangerListShow = ref(false)
  389. function showDangerList() {
  390. dangerListShow.value = !dangerListShow.value
  391. }
  392. const listData_zxjc = reactive({data: []})
  393. function getData_yxdt() {
  394. GetYxdt().then(res => {
  395. cataData_yxdt.data.forEach(i => {
  396. i.value = res.data[i.fieldName]
  397. })
  398. })
  399. }
  400. const boatInfoShow = ref(false)
  401. function clickYunXingDongTaiDetial(name) {
  402. boatTypeForClick.type=name;
  403. boatInfoShow.value =!boatInfoShow.value
  404. }
  405. const cataData_yxdt = reactive({data: [
  406. { title: '即将作业船舶数', fieldName: 'willWorkCount', value: 0 },
  407. { title: '作业完成船舶数', fieldName: 'finishWorkCount', value: 0 },
  408. { title: '作业中船舶数', fieldName: 'workingCount', value: 0 },
  409. ]})
  410. function getData_wggj() {
  411. GetWggj().then(res => {
  412. listData_wggj.data.forEach(i => {
  413. i.value = res.data[i.fieldName]
  414. if('value_ent' in i) {
  415. i.value_ent = res.data['overGradeUnit']
  416. }
  417. })
  418. })
  419. }
  420. const listData_wggj = reactive({data: [
  421. { type: '超等级靠泊', fieldName: 'overGradeShip', value: 0, value_ent: 0 },
  422. { type: '港口经营许可证即将到期', fieldName: 'portExpire', value: 0 },
  423. { type: '危险货物作业附证即将到期', fieldName: 'dangerExpire', value: 0 },
  424. ]})
  425. const entWarningListShow = ref(false)
  426. const shipWarningListShow = ref(false)
  427. const unitXuKeListShow = ref(false)
  428. const listData_cdjkb = reactive({
  429. ent: [],
  430. ship: []
  431. })
  432. function handleOpenUnitXuKe(type) {
  433. unitXuKeListShow.value=!unitXuKeListShow.value
  434. console.log("类型:"+type)
  435. unitWarningType.type=type
  436. }
  437. function handleOpenWarningEnt() {
  438. ueCallBreathGetPoint()
  439. GetQywggj().then(res => {
  440. listData_cdjkb.ent = res.data.Rows
  441. })
  442. shipWarningListShow.value = false
  443. entWarningListShow.value = true
  444. }
  445. function handlePickWarningEnt(ent) {
  446. ueCallClickBreth(ent.objectId)
  447. }
  448. function handleCloseWarningEnt() {
  449. entWarningListShow.value = false
  450. ueCallClearAllBreth()
  451. }
  452. function handleCloseWarningShip() {
  453. shipWarningListShow.value = false
  454. ueCallCloseSuperLevelBoat()
  455. }
  456. function handleOpenWarningShip() {
  457. ueCallShowSuperLevelBoat()
  458. GetCbwgyj().then(res => {
  459. listData_cdjkb.ship = res.data.Rows
  460. })
  461. if(entWarningListShow.value===true) {
  462. handleCloseWarningEnt()
  463. }
  464. shipWarningListShow.value = true
  465. }
  466. </script>
  467. <style lang="scss" scoped>
  468. #yyjg {
  469. .panel-left, .panel-right {
  470. box-sizing: border-box;
  471. position: absolute;
  472. top: 105px;
  473. width: 380px;
  474. height: calc(100vh - 105px);
  475. text-align: left;
  476. display: flex;
  477. flex-direction: column;
  478. justify-content: space-between;
  479. transition: all 0.5s ease;
  480. }
  481. .panel-left {
  482. left: 0;
  483. padding: 0 30px 60px;
  484. &.is-hide {
  485. left: -380px;
  486. }
  487. }
  488. .panel-right {
  489. right: 0;
  490. padding: 0 30px 30px;
  491. &.is-hide {
  492. right: -380px;
  493. }
  494. .pr {
  495. display: flex;
  496. flex-direction: column;
  497. align-items: flex-end;
  498. }
  499. }
  500. .pl-b1 {
  501. .plb1-content {
  502. .title2-left {
  503. margin: 15px 0;
  504. }
  505. li {
  506. width: fit-content;
  507. display: flex;
  508. align-items: center;
  509. margin: 30px 0 40px;
  510. cursor: pointer;
  511. &>img {
  512. width: 97px;
  513. height: 89px;
  514. margin: 0 20px 0 -10px;
  515. }
  516. &>div {
  517. display: flex;
  518. flex-direction: column;
  519. span:nth-child(1) {
  520. position: relative;
  521. display: inline-block;
  522. width: 153px;
  523. height: 26px;
  524. margin-top: 12px;
  525. font-size: 16px;
  526. font-weight: bold;
  527. font-style: italic;
  528. color: transparent;
  529. line-height: 26px;
  530. background: linear-gradient(0deg, #ACDDFF 0%, #FFFFFF 100%);
  531. -webkit-background-clip: text;
  532. &::after {
  533. content: '';
  534. position: absolute;
  535. left: 0;
  536. top: 0;
  537. width: 100%;
  538. height: 100%;
  539. background: url('@/assets/imgs/page_yyjg/bg-text1.png') no-repeat;
  540. background-size: 100% 100%;
  541. z-index: -1;
  542. }
  543. }
  544. span:nth-child(2) {
  545. font-size: 30px;
  546. font-family: BarlowBold;
  547. font-style: italic;
  548. color: transparent;
  549. background: linear-gradient(180deg, #FFFFFF 30%, #47D5F7 100%);
  550. -webkit-background-clip: text;
  551. }
  552. }
  553. }
  554. }
  555. }
  556. .pl-b2 {
  557. .title2-left {
  558. margin: 3vh 0;
  559. }
  560. .list-item-normal, .list-item-danger {
  561. display: flex;
  562. align-items: center;
  563. &>div {
  564. &>div {
  565. margin: 3px 0 8px;
  566. span:first-child {
  567. box-sizing: border-box;
  568. display: inline-block;
  569. padding: 0 5px;
  570. flex: 1;
  571. text-align: right;
  572. font-size: 22px;
  573. line-height: 22px;
  574. font-family: BarlowBold;
  575. color: transparent;
  576. background: linear-gradient(180deg, #08D8BC 0%, #10ECDE 100%);
  577. -webkit-background-clip: text;
  578. }
  579. span:last-child {
  580. font-size: 16px;
  581. line-height: 14px;
  582. color: #ddd;
  583. }
  584. }
  585. &>span {
  586. padding-left: 4px;
  587. font-size: 16px;
  588. line-height: 16px;
  589. color: #ddd;
  590. }
  591. }
  592. }
  593. .list-item-normal {
  594. align-items: flex-start;
  595. &:not(:last-child) {
  596. margin-bottom: 20px;
  597. }
  598. &>img {
  599. width: 103px;
  600. height: 77px;
  601. }
  602. &>div {
  603. margin-top: 4px;
  604. }
  605. }
  606. .list-item-danger {
  607. &>img {
  608. width: 103px;
  609. height: 93px;
  610. }
  611. }
  612. }
  613. .pr-b1 {
  614. .title1-right {
  615. letter-spacing: 1px;
  616. }
  617. .prb1-option {
  618. display: flex;
  619. justify-content: space-between;
  620. align-items: center;
  621. width: 80%;
  622. margin-bottom: 10px;
  623. font-size: 16px;
  624. color: #349ed8;
  625. &>label {
  626. display: flex;
  627. align-items: center;
  628. cursor: pointer;
  629. &>input {
  630. margin-right: 3px;
  631. width: 13px;
  632. height: 13px;
  633. }
  634. }
  635. &>span {
  636. cursor: pointer;
  637. &:hover {
  638. filter: brightness(1.2);
  639. }
  640. }
  641. }
  642. .prb1-main {
  643. width: 300px;
  644. height: 19vh;
  645. overflow: hidden;
  646. position: relative;
  647. .prb1-list {
  648. position: absolute;
  649. top: 0;
  650. }
  651. .prb1-empty {
  652. display: block;
  653. width: 100%;
  654. text-align: center;
  655. margin-top: 8vh;
  656. font-size: 16px;
  657. color: #aaa;
  658. }
  659. }
  660. .prb1-main-item {
  661. display: flex;
  662. align-items: center;
  663. margin: 10px 0 20px;
  664. &>i {
  665. display: flex;
  666. width: 73px;
  667. height: 86px;
  668. background: url('@/assets/imgs/common/icon-lshb.png') no-repeat;
  669. background-size: 100% 100%;
  670. }
  671. &>div {
  672. &>div:nth-child(1) {
  673. box-sizing: border-box;
  674. display: flex;
  675. justify-content: space-between;
  676. align-items: center;
  677. padding: 0 5px;
  678. width: 222px;
  679. height: 24px;
  680. background: url('@/assets/imgs/common/bg-text1.png') no-repeat;
  681. background-size: 100% 100%;
  682. span:nth-child(1) {
  683. padding-right: 4px;
  684. font-size: 18px;
  685. font-weight: bold;
  686. font-style: italic;
  687. color: transparent;
  688. background: linear-gradient(0deg, #ACDDFF 0%, #FFFFFF 100%);
  689. -webkit-background-clip: text;
  690. }
  691. span:nth-child(2) {
  692. font-size: 16px;
  693. font-weight: 400;
  694. font-style: italic;
  695. color: #FF0000;
  696. }
  697. }
  698. &>span:nth-child(2) {
  699. box-sizing: border-box;
  700. padding: 0 5px;
  701. display: block;
  702. margin: 10px 0;
  703. font-size: 16px;
  704. font-family: BarlowBold;
  705. color: rgba($color: #fff, $alpha: 0.6);
  706. }
  707. &>div:nth-child(3) {
  708. box-sizing: border-box;
  709. padding: 0 5px;
  710. display: flex;
  711. justify-content: space-between;
  712. align-items: center;
  713. &>div {
  714. display: flex;
  715. align-items: center;
  716. }
  717. div>span:nth-child(1) {
  718. font-size: 16px;
  719. font-weight: 400;
  720. color: #FFFFFF;
  721. }
  722. div:nth-child(1)>span:nth-child(2) {
  723. display: inline-block;
  724. max-width: 57px;
  725. overflow: hidden;
  726. white-space: nowrap;
  727. text-overflow: ellipsis;
  728. font-size: 16px;
  729. color: #66E6FF;
  730. }
  731. div:nth-child(2)>span:nth-child(2) {
  732. font-size: 16px;
  733. font-family: BarlowBold;
  734. color: #66E6FF;
  735. }
  736. }
  737. }
  738. }
  739. }
  740. .pr-b2 {
  741. .prb2-main {
  742. position: relative;
  743. width: 95%;
  744. height: 25vh;
  745. &>div {
  746. display: flex;
  747. flex-direction: column;
  748. align-items: center;
  749. position: absolute;
  750. &>span:nth-child(1) {
  751. font-size: 24px;
  752. font-family: BarlowBold;
  753. color: #A5D2FF;
  754. }
  755. &>span:nth-child(2) {
  756. font-size: 14px;
  757. font-weight: 400;
  758. color: rgba($color: #FAFCFF, $alpha: 0.8);
  759. }
  760. &>i {
  761. display: block;
  762. width: 98px;
  763. height: 98px;
  764. background: url('@/assets/imgs/page_yyjg/icon-yxdt2.png') no-repeat;
  765. background-size: 100% 100%;
  766. margin-top: -30px;
  767. }
  768. &>div:nth-child(4) {
  769. position: relative;
  770. width: 70px;
  771. text-align: center;
  772. span {
  773. font-size: 16px;
  774. font-weight: 400;
  775. color: #FFFFFF;
  776. }
  777. i {
  778. position: absolute;
  779. left: -15px;
  780. top: 2px;
  781. display: inline-block;
  782. width: 13px;
  783. height: 13px;
  784. transform: translateY(2px);
  785. margin-right: 3px;
  786. background: url('@/assets/imgs/page_yyjg/dot-blue.png') no-repeat;
  787. background-size: 100% 100%;
  788. }
  789. }
  790. }
  791. &>div:nth-child(1) {
  792. top: 30px;
  793. left: 0;
  794. }
  795. &>div:nth-child(2) {
  796. top: 30px;
  797. right: 0;
  798. }
  799. &>div:nth-child(3) {
  800. top: 90px;
  801. left: 50%;
  802. transform: translateX(-50%);
  803. &>i {
  804. background: url('@/assets/imgs/page_yyjg/icon-yxdt1.png') no-repeat;
  805. background-size: 100% 100%;
  806. margin-top: -20px;
  807. }
  808. &>div:nth-child(4) {
  809. width: fit-content;
  810. i {
  811. background: url('@/assets/imgs/page_yyjg/dot-green.png') no-repeat;
  812. background-size: 100% 100%;
  813. }
  814. }
  815. }
  816. }
  817. }
  818. .pr-b3 {
  819. .prb3-item {
  820. display: flex;
  821. align-items: center;
  822. margin-bottom: 10px;
  823. i {
  824. display: block;
  825. width: 83px;
  826. height: 81px;
  827. background: url('@/assets/imgs/page_yyjg/icon-wg.png') no-repeat;
  828. background-size: 100% 100%;
  829. }
  830. &>div {
  831. margin-right: 20px;
  832. &>span:nth-child(1) {
  833. position: relative;
  834. display: block;
  835. width: 180px;
  836. height: 26px;
  837. margin-bottom: 10px;
  838. padding-left: 8px;
  839. font-size: 16px;
  840. font-weight: bold;
  841. font-style: italic;
  842. color: transparent;
  843. line-height: 26px;
  844. background: linear-gradient(0deg, #ACDDFF 0%, #FFFFFF 100%);
  845. -webkit-background-clip: text;
  846. &::after {
  847. content: '';
  848. position: absolute;
  849. top: 0;
  850. left: 0;
  851. width: 100%;
  852. height: 100%;
  853. background: url('@/assets/imgs/page_yyjg/bg-wggj.png') no-repeat;
  854. background-size: 100% 100%;
  855. z-index: -1;
  856. }
  857. }
  858. &>div {
  859. display: flex;
  860. justify-content: space-between;
  861. align-items: flex-end;
  862. &>span {
  863. font-size: 18px;
  864. }
  865. }
  866. .value-boat, .value-ent {
  867. display: block;
  868. width: fit-content;
  869. padding: 0 5px 0 3px;
  870. font-size: 26px;
  871. line-height: 26px;
  872. font-family: BarlowBold;
  873. font-style: italic;
  874. color: transparent;
  875. -webkit-background-clip: text;
  876. cursor: pointer;
  877. }
  878. .value-boat {
  879. background: linear-gradient(180deg, #FFFFFF 30%, #47D5F7 100%);
  880. -webkit-background-clip: text;
  881. }
  882. .value-ent {
  883. background: linear-gradient(180deg, #FFFFFF 30%, #fafa49 100%);
  884. -webkit-background-clip: text;
  885. }
  886. }
  887. }
  888. }
  889. }
  890. </style>