index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <template>
  2. <div class="base-container no-events">
  3. <fnHeader showDate></fnHeader>
  4. <div class="content">
  5. <navigation @handleTab="handleTab" @handleTabFeiXun="handleTabFeiXun"></navigation>
  6. <div class="left yes-events">
  7. <tool-list
  8. direction="left"
  9. :list="leftToolList"
  10. @handleActive="handleActiveLeft"
  11. ></tool-list>
  12. <component :is="components[currentComponent]" />
  13. <!-- 箭头 -->
  14. <div class="arrow" @click="handleShrink">
  15. <el-icon class="icon" color="#141414"><DArrowLeft /></el-icon>
  16. </div>
  17. </div>
  18. <div class="home-bottom">
  19. <!-- <time-line class="time-wrap yes-events"></time-line> -->
  20. <!-- <img class="fly-icon" src="@/assets/images/home/fly-icon.png" alt=""> -->
  21. <div class="bottom-button" v-show="curName==='查看遥感信息'" @click="handleSetps">生成采样航线</div>
  22. </div>
  23. <div class="right yes-events">
  24. <div class="list">
  25. <chart-box name="农事列表" arrow="arrow-left" :class="{'list-wrap': rightIndex===0}">
  26. <template v-if="rightIndex===0">
  27. <album></album>
  28. </template>
  29. <template v-if="rightIndex===1">
  30. <div class="img-box1">
  31. <img src="@/assets/images/home/fh01.png" alt="">
  32. <img src="@/assets/images/home/fh02.png" alt="">
  33. </div>
  34. </template>
  35. <template v-if="rightIndex===2">
  36. <div class="btn-wrap">
  37. <div :class="{active:btnIndex===0}" @click="handleBtn(0)">{{btnIndex===0&&btnName!=''?'采样分区:'+ btnName:'选择采样分区'}}</div>
  38. <div :class="{active:btnIndex===1}" @click="handleBtn(1)">{{btnIndex===1&&btnName!=''?'单树编号:'+ btnName:'选择树'}}</div>
  39. </div>
  40. <div class="img-box2" v-show="showPoint">
  41. <img v-if="showType==='point'" src="@/assets/images/home/line-chart.png" alt="">
  42. <img v-else src="@/assets/images/home/line-chart2.png" alt="">
  43. <img src="@/assets/images/home/fh01.png" alt="">
  44. </div>
  45. <div class="img-box2" v-show="!showPoint">
  46. <img v-if="showType==='point'" src="@/assets/images/home/line-chart1.png" alt="">
  47. <img v-else src="@/assets/images/home/line-chart3.png" alt="">
  48. <img src="@/assets/images/home/fh02.png" alt="">
  49. </div>
  50. </template>
  51. </chart-box>
  52. </div>
  53. <tool-list direction="right" :list="rightToolList" @handleActive="handleActiveRight"></tool-list>
  54. </div>
  55. <!-- 图例 -->
  56. <!-- <img class="legend yes-events" src="@/assets/images/home/legend.png" alt=""> -->
  57. </div>
  58. </div>
  59. <div ref="mapRef" class="bottom-map"></div>
  60. <!-- 图片弹窗 -->
  61. <PicturePreview
  62. :imageUrl="urls"
  63. :curIndex="urlsIndex"
  64. ></PicturePreview>
  65. <!-- -->
  66. <album-carousel></album-carousel>
  67. <!-- 果园报告 -->
  68. <PdfDialog title="果园报告" ></PdfDialog>
  69. <el-dialog
  70. v-model="dialogVisible"
  71. width="450"
  72. align-center
  73. >
  74. <div class="dialog-box" style="text-align: center;">
  75. <img style="width:65px;height:65px;margin-bottom:12px" src="@/assets/images/home/search.png" alt="">
  76. <div style="font-size:25px">正在分析中...</div>
  77. </div>
  78. </el-dialog>
  79. </template>
  80. <script setup>
  81. import { onMounted, onUnmounted, ref } from "vue";
  82. import config from "@/api/config.js"
  83. import timeLine from "@/components/timeLine.vue";
  84. import PicturePreview from "@/components/PicturePreview.vue";
  85. import fnHeader from "@/components/fnHeader.vue";
  86. import navigation from "@/components/navigation.vue";
  87. import chartBox from "@/components/chartBox.vue";
  88. // import StaticMapLayers from "@/components/static_map_change/Layers.js"
  89. import toolList from "@/components/toolList.vue";
  90. import fileBar from "@/components/fileBar.vue";
  91. import HomeMap from "./map/homeMap";
  92. import homePage from "./components/homePage.vue";
  93. import weatherPage from "./components/weatherPage.vue";
  94. import phenologyPage from "./components/phenologyPage.vue";
  95. import indicatorChart from "./components/indicatorChart.vue";
  96. import { useRouter } from "vue-router";
  97. import SamplePointLayer from "./map/samplePointLayer";
  98. import {useStore} from "vuex";
  99. import RegionLayer from "./map/regionLayer";
  100. import BlueRegionLayer from "./map/blueRegionLayer";
  101. import eventBus from "@/api/eventBus";
  102. import AlbumCarousel from "./album_compoents/albumCarousel.vue";
  103. import album from "./album/index.vue";
  104. import PdfDialog from "../../components/PdfDialog"
  105. let store = useStore()
  106. const components = {
  107. homePage,
  108. weatherPage,
  109. phenologyPage,
  110. };
  111. //当前农场
  112. const currentFarm = {
  113. id: store.getters.userinfo.curFarmId,
  114. name: store.getters.userinfo.curFarmName,
  115. }
  116. //当前区域
  117. const currentRegion = {
  118. id: null,
  119. name: null
  120. }
  121. let homeMap = new HomeMap();
  122. let samplePointLayer = null
  123. let regionLayer = null
  124. let blueRegionLayer = null
  125. const router = useRouter();
  126. const mapRef = ref();
  127. let staticMapLayers = null;
  128. onMounted(() => {
  129. homeMap.initMap("POINT (113.67884027228604 23.511176408307904)", mapRef.value);
  130. // homeMap.initMap(store.getters.userinfo.location, mapRef.value);
  131. // regionLayer = new RegionLayer(homeMap.kmap.map, currentFarm, currentRegion)
  132. samplePointLayer = new SamplePointLayer(homeMap.kmap.map,homeMap.kmap)
  133. blueRegionLayer = new BlueRegionLayer(homeMap.kmap)
  134. // staticMapLayers = new StaticMapLayers(homeMap.kmap);
  135. getYellow()
  136. // getFarmLog()
  137. //区域切换监听事件
  138. eventBus.on('area:id',areaId)
  139. //选项卡子项事件监听
  140. eventBus.on('handleTabItem',handleTabItem)
  141. setTimeout(()=>{
  142. editStep(0,0)
  143. },600)
  144. // eventBus.emit('steps','0')
  145. // VE_API.feixun.getSteps({"k": "step",resultType:"json"}).then(res =>{
  146. // if(res.data.step!=='0'){
  147. // setTimeout(()=>{
  148. // getSteps('all')
  149. // },500)
  150. // }else{
  151. // setTimeout(()=>{
  152. // editStep(res.data)
  153. // },500)
  154. // eventBus.emit('steps','0')
  155. // }
  156. // })
  157. });
  158. onUnmounted(()=>{
  159. eventBus.off('area:id',areaId)
  160. eventBus.off('handleTabItem',handleTabItem)
  161. })
  162. const getSteps = (type) =>{
  163. VE_API.feixun.getSteps({"k": "step",resultType:"json"}).then(res =>{
  164. eventBus.emit('steps:value',{data:res.data})
  165. if(type=='area'){
  166. getBlueRegionList(()=>{},res.data.blue_step)
  167. return
  168. }
  169. if(type=='all'){
  170. getBlueRegionList(()=>{},res.data.blue_step)
  171. samplePointLayer.initData(organId.value,regionId.value)
  172. return
  173. }
  174. if(type=='point'){
  175. samplePointLayer.initData(organId.value,regionId.value)
  176. return
  177. }
  178. })
  179. }
  180. const dialogVisible = ref(false)
  181. const curName = ref('异常总览')
  182. function handleTabFeiXun(name){
  183. homeMap.hideAll()
  184. curName.value = name
  185. if(name==='查看飞巡结果'){
  186. editStep(1,2,'area')
  187. eventBus.emit('steps','1')
  188. getSteps('all')
  189. }
  190. if(name==='精细检测'){
  191. editStep(2,2,'point')
  192. }
  193. if(name==='查看遥感信息'){
  194. handleTabItem('地形因子')
  195. }
  196. }
  197. const handleSetps = () =>{
  198. dialogVisible.value = true
  199. setTimeout(()=>{
  200. dialogVisible.value = false
  201. homeMap.hideAll()
  202. editStep(1,1,'all')
  203. },10000)
  204. }
  205. async function editStep(step,blue_step,type){
  206. await VE_API.feixun.editStep({step,blue_step})
  207. getSteps(type)
  208. // VE_API.feixun.editStep({step}).then(res =>{
  209. // getSteps(type)
  210. // })
  211. }
  212. const blueList = ref([])
  213. const getBlueRegionList = (callback,step) =>{
  214. VE_API.farm.blueRegionList({farmId:organId.value,selectAll:1}).then(({ data }) => {
  215. blueList.value = data.map(item =>{
  216. let color = 'rgba(255, 255, 255, 0)' //失效区域
  217. if(item.stepStatus===1){ //物候期风险
  218. color = 'rgba(255, 255, 255, 0.5)'
  219. }
  220. if(item.stepStatus===0){ //物候期风险
  221. color = 'rgba(255, 255, 255, 0.5)'
  222. }
  223. if(item.stepStatus===2){ //生长异常
  224. color = 'rgba(255, 252, 61, 0.5)'
  225. }
  226. if(item.stepStatus===3){ //病虫害
  227. color = 'rgba(255, 73, 73, 0.5)'
  228. }
  229. return {
  230. ...item,
  231. color
  232. }
  233. })
  234. blueRegionLayer.initData(blueList.value,'',step!=='0'?true:false)
  235. callback && callback()
  236. });
  237. }
  238. const organId = ref(null)
  239. const regionId = ref(null)
  240. const tabName = ref('')
  241. const tabId = ref(0)
  242. //选项卡事件监听
  243. const handleTab = async ({name,id,isUpdate,params}) =>{
  244. tabName.value = name
  245. tabId.value = id
  246. if(id===0){
  247. // getBlueRegionList(()=>{
  248. // if(isUpdate){
  249. // handleTabItem(params)
  250. // }
  251. // })
  252. }else{
  253. getFarmIndexReport((()=>{
  254. if(isUpdate){
  255. handleTabItem(params)
  256. }
  257. }))
  258. }
  259. }
  260. //区域切换监听事件
  261. function areaId({areaId,farmId}){
  262. organId.value = farmId
  263. regionId.value = areaId
  264. setTimeout(()=>{
  265. samplePointLayer.initData(farmId,areaId)
  266. },400)
  267. if(tabId.value===0){
  268. // getBlueRegionList()
  269. // VE_API.feixun.getSteps({"k": "step",}).then(res =>{
  270. // if(res.data!=='0'){
  271. // setTimeout(()=>{
  272. // getSteps('all')
  273. // },450)
  274. // }else{
  275. // setTimeout(()=>{
  276. // editStep(0)
  277. // },450)
  278. // eventBus.emit('steps','0')
  279. // }
  280. // })
  281. }else{
  282. getFarmIndexReport()
  283. }
  284. }
  285. //选项卡子项事件监听
  286. const handleTabItem = (name) =>{
  287. let text = '井岗荔枝分布'
  288. if(name==='地形因子'){
  289. text = '井岗地形因子'
  290. }else if(name==='推测物候期'){
  291. text = '井岗推测物候期'
  292. }
  293. if(text!==''){
  294. homeMap.showSingle(text,true)
  295. }else{
  296. homeMap.hideAll()
  297. }
  298. // if(reportData.value.blueZoneList){
  299. // const index = reportData.value.blueZoneList.findIndex(item => item.key===e)
  300. // let arr = []
  301. // if(reportData.value.blueZoneList.length){
  302. // arr = blueListConvert(reportData.value.blueZoneList[index].obj,index)
  303. // }
  304. // blueRegionLayer.initData(arr,'87')
  305. // }
  306. }
  307. const reportData = ref({})
  308. const blueListConvert = (data,index)=>{
  309. const list = []
  310. for (let key in data) {
  311. const filterData = reportData.value.blueZoneLegendList[index].list.filter(item => item.val === key)
  312. const arr = data[key]
  313. arr.forEach(item =>{
  314. const listObj = blueList.value.filter(ele =>ele.blueZoneCode === item)
  315. const updateList = listObj.map(ele => {
  316. return{
  317. ...ele,
  318. level: key,
  319. name:filterData[0].name,
  320. color:filterData[0].color
  321. }
  322. })
  323. list.push(...updateList)
  324. })
  325. }
  326. return list
  327. }
  328. const getFarmIndexReport = (callback) =>{
  329. // const params = { farmId:organId.value,regionId:regionId.value, type: tabName.value };
  330. // VE_API.farm.farmIndexReport(params).then(({data,code}) => {
  331. // if (code === 0) {
  332. // reportData.value = data || {};
  333. // let arr = []
  334. // if(data.blueZoneList.length){
  335. // arr = blueListConvert(data.blueZoneList[0].obj,0)
  336. // }
  337. // blueRegionLayer.initData(arr,'87')
  338. // callback && callback()
  339. // }
  340. // });
  341. }
  342. const indicatorChartData = ref({})
  343. const blueZone = ref('ws0y1meyhxp4')
  344. const getFarmLog = () =>{
  345. const params = {
  346. id: null,
  347. farmId: 766,
  348. blueZone:blueZone.value
  349. }
  350. VE_API.warning.fetchFarmLog(params).then(({data}) => {
  351. indicatorChartData.value = data || {}
  352. eventBus.emit('chart:updateOption',data)
  353. })
  354. }
  355. const urls = ref([])
  356. const urlsIndex = ref(0)
  357. const getYellow = () =>{
  358. VE_API.home.getYellowList().then(res =>{
  359. // urls.value = res.data.map(item =>{
  360. // return {
  361. // ...item,
  362. // imgPath:config.base_img_url2+item.cloudFilename
  363. // }
  364. // })
  365. // urls.value = [
  366. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-07.jpg",
  367. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-08.jpg",
  368. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-09.jpg",
  369. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-10.jpg",
  370. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-11.jpg",
  371. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-12.jpg",
  372. // "@/assets/images/home/HB-ws0y1menggxv/HB-ws0y1menggxv2025-01-13.jpg",
  373. // ]
  374. })
  375. }
  376. const btnIndex = ref(null)
  377. const btnName = ref("")
  378. const handleBtn = (e) =>{
  379. btnName.value = ""
  380. btnIndex.value = e
  381. eventBus.emit("clear:area")
  382. samplePointLayer.updateAreaStatus(e===0?true:false)
  383. regionLayer.resetData()
  384. samplePointLayer.resetPoint()
  385. }
  386. //点击果园日志
  387. const handleSelectArea = () =>{
  388. btnName.value = ""
  389. btnIndex.value = null
  390. eventBus.emit("clear:area")
  391. regionLayer.resetData()
  392. samplePointLayer.resetPoint()
  393. samplePointLayer.updateAreaStatus(true)
  394. }
  395. //农事点击高亮
  396. const act = ref(null)
  397. const handleAct = (v) =>{
  398. act.value = v
  399. samplePointLayer.resetPoint()
  400. if(v===1){
  401. regionLayer.selectAreaMultiple([
  402. {value:2,color:"blue"},
  403. {value:4,color:"blue1"},
  404. {value:5,color:"blue2"},
  405. {value:7,color:"blue"},
  406. {value:13,color:"blue2"},
  407. ])
  408. }
  409. if(v===2){
  410. regionLayer.selectAreaMultiple([
  411. {value:1,color:"blue"},
  412. {value:2,color:"blue1"},
  413. {value:9,color:"blue2"},
  414. {value:12,color:"blue2"},
  415. ])
  416. }
  417. }
  418. //柱状图点击事件监听
  419. eventBus.on('echart:barClick',(e)=>{
  420. btnName.value = ""
  421. btnIndex.value = null
  422. eventBus.emit("clear:area")
  423. samplePointLayer.updateAreaStatus(false)
  424. const arr = ["花穗伸长", "啃食虫害","毛毡病"]
  425. const isDraw = arr.includes(e)
  426. const index = arr.indexOf(e)
  427. if(isDraw){
  428. if(index===0){
  429. regionLayer.selectAreaMultiple([
  430. {value:0,color:"green"},
  431. {value:1,color:"green"},
  432. {value:2,color:"green"},
  433. {value:3,color:"green1"},
  434. {value:4,color:"green1"},
  435. {value:5,color:"green2"},
  436. {value:6,color:"green1"},
  437. {value:7,color:"green2"},
  438. {value:8,color:"green2"},
  439. {value:9,color:"green"},
  440. {value:10,color:"green"},
  441. {value:11,color:"green1"},
  442. {value:12,color:"green2"},
  443. {value:13,color:"green"},
  444. {value:14,color:"green2"},
  445. ])
  446. }else if(index===1){
  447. regionLayer.selectAreaMultiple([{value:6,color:"red"}])
  448. }else{
  449. regionLayer.selectAreaMultiple([
  450. {value:12,color:"red2"},
  451. {value:10,color:"red"},
  452. {value:1,color:"red"}
  453. ])
  454. }
  455. }
  456. })
  457. //黄板点击事件监听
  458. eventBus.on('click:yellowBlock',(e)=>{
  459. const arr = ["113.61396985128522","113.61390710255375","113.61491218688275"]
  460. if(arr[0]==e){
  461. urls.value = ["HB-ws0y1menggxv"]
  462. urlsIndex.value = 0
  463. }
  464. if(arr[1]==e){
  465. urls.value = ["HB-ws0y1mg0pvd" ]
  466. urlsIndex.value = 3
  467. }
  468. if(arr[2]==e){
  469. urls.value = ["HB-ws0y1mg9wpcp"]
  470. urlsIndex.value = 6
  471. }
  472. eventBus.emit('dialog:show',true)
  473. })
  474. const showPoint = ref(true)
  475. const showType = ref("point")
  476. eventBus.on('click:updateArea',(e)=>{
  477. blueZone.value = e.value
  478. btnName.value=e.name
  479. regionLayer.selectArea((e.name*1)===0?0: (e.name*1) - 1,"blue")
  480. //getFarmLog()
  481. })
  482. const currentComponent = ref("homePage");
  483. const handleActiveLeft = (e) => {
  484. currentComponent.value = e.componentName;
  485. if(e.title==='首页'){
  486. router.push('/warningHome')
  487. }
  488. };
  489. const leftToolList = [
  490. {
  491. title: "首页",
  492. name: "home",
  493. componentName: "homePage",
  494. },
  495. {
  496. title: "气象预警",
  497. componentName: "weatherPage",
  498. },
  499. {
  500. title: "物候调节",
  501. componentName: "phenologyPage",
  502. },
  503. {
  504. title: "病虫测报",
  505. },
  506. {
  507. title: "营养评估",
  508. },
  509. ];
  510. const rightIndex = ref(0)
  511. const handleActiveRight = ({index}) => {
  512. rightIndex.value = index
  513. btnIndex.value = null
  514. btnName.value = ""
  515. samplePointLayer.updateAreaStatus(false)
  516. regionLayer.resetData()
  517. samplePointLayer.resetPoint()
  518. if(index!==0){
  519. act.value = null
  520. }
  521. };
  522. const hanleRightIndex = (num) =>{
  523. rightIndex.value = num
  524. eventBus.emit('tool:updateAct',num)
  525. }
  526. const rightToolList = [
  527. {
  528. title: "农事列表",
  529. index:0,
  530. },
  531. {
  532. title: "处方分析",
  533. index:2,
  534. },
  535. {
  536. title: "复核对比",
  537. index:1,
  538. },
  539. ];
  540. // 跳转果园档案
  541. const toFilePage = () => {
  542. router.push('/garden-file')
  543. }
  544. </script>
  545. <style lang="scss" scoped>
  546. .base-container {
  547. width: 100%;
  548. height: 100vh;
  549. color: #fff;
  550. position: absolute;
  551. box-sizing: border-box;
  552. z-index: 1;
  553. .content {
  554. width: 100%;
  555. height: calc(100% - 74px - 48px);
  556. display: flex;
  557. justify-content: space-between;
  558. box-sizing: border-box;
  559. .left,
  560. .right {
  561. width: calc(376px + 54px);
  562. height: 100%;
  563. margin-top: 10px;
  564. box-sizing: border-box;
  565. display: flex;
  566. position: relative;
  567. }
  568. .left{
  569. background: #101010;
  570. border-radius: 4px;
  571. border: 1px solid #444444;
  572. .arrow{
  573. position: absolute;
  574. right: -16px;
  575. top:calc(50% - 40px);
  576. background: #fff;
  577. width: 16px;
  578. height: 80px;
  579. line-height: 80px;
  580. border-radius: 0 5px 5px 0;
  581. text-align: center;
  582. cursor: pointer;
  583. }
  584. }
  585. .right {
  586. .list {
  587. width: 100%;
  588. height: 100%;
  589. .btn-wrap{
  590. width: 100%;
  591. height: 25px;
  592. line-height: 25px;
  593. margin: 10px 0;
  594. display: flex;
  595. align-items: center;
  596. justify-content: space-between;
  597. div{
  598. width: 48%;
  599. height: 100%;
  600. color: #FFD489;
  601. border: 1px solid rgba(255,213,137,0.6);
  602. border-radius: 2px;
  603. text-align: center;
  604. font-size: 12px;
  605. cursor: pointer;
  606. &.active{
  607. background: #FFD489;
  608. color: #000;
  609. }
  610. }
  611. }
  612. .img-box{
  613. width: 100%;
  614. height: calc(100% - 35px);
  615. overflow: auto;
  616. }
  617. .img-box1{
  618. width: 100%;
  619. height: calc(100% - 10px);
  620. overflow: auto;
  621. margin-top: 10px;
  622. }
  623. .img-box2{
  624. width: 100%;
  625. height: calc(100% - 45px);
  626. overflow: auto;
  627. margin-top: 10px;
  628. }
  629. img{
  630. width: 100%;
  631. height: auto;
  632. object-fit: cover;
  633. margin-bottom: 12px;
  634. cursor: pointer;
  635. }
  636. .mt{
  637. margin-top: -12px;
  638. }
  639. .list-wrap {
  640. ::v-deep {
  641. .chart-content {
  642. padding: 16px 0 0 0;
  643. }
  644. }
  645. }
  646. }
  647. }
  648. .overflow{
  649. overflow: auto;
  650. }
  651. .home-bottom {
  652. display: flex;
  653. align-items: flex-end;
  654. justify-content: flex-end;
  655. width: calc(100% - 60px - 430px * 2 );
  656. // height: 152px;
  657. align-self: flex-end;
  658. .bottom-button{
  659. background: linear-gradient(0deg,#FFD887,#ED9E1E);
  660. border: 1px solid rgba(255, 255, 255, 0.61);
  661. border-radius: 12px;
  662. font-size: 20px;
  663. font-family: "PangMenZhengDao";
  664. padding: 15px 39px 16px 39px;
  665. color: #000;
  666. cursor: pointer;
  667. pointer-events: auto;
  668. }
  669. .time-wrap{
  670. height: 85px;
  671. }
  672. .fly-icon{
  673. width: 148px;
  674. height: 100%;
  675. margin-left: 27px;
  676. }
  677. .log-box {
  678. height: 34%;
  679. width: calc(100% - 340px - 28px);
  680. margin-right: 28px;
  681. .box-name{
  682. width: 89px;
  683. height: 22px;
  684. text-align: center;
  685. line-height: 22px;
  686. border-radius: 20px;
  687. margin: 10px 0 5px 6px;
  688. cursor: pointer;
  689. background: linear-gradient(0deg,#BBA269 0%, #3D3523 100%);
  690. }
  691. .log-content {
  692. font-size: 12px;
  693. line-height: 1.5;
  694. padding: 0 18px;
  695. }
  696. .chart-wrap{
  697. width: 100%;
  698. height: calc(100% - 50px);
  699. .line{
  700. margin-top: 10px;
  701. margin-bottom: 12px;
  702. }
  703. img{
  704. width: 100%;
  705. margin-bottom: 10px;
  706. }
  707. }
  708. }
  709. .file-box {
  710. height: 25%;
  711. min-height: 210px;
  712. width: 340px;
  713. position: relative;
  714. img{
  715. width: 100%;
  716. margin-top: 12px;
  717. }
  718. .arrow-icon {
  719. top: -32px;
  720. left: 50%;
  721. position: absolute;
  722. background: #fff;
  723. width: 16px;
  724. height: 80px;
  725. line-height: 80px;
  726. border-radius: 5px 0 0 5px;
  727. text-align: center;
  728. transform: translateX(-50%) rotate(270deg);
  729. }
  730. .edit-btn {
  731. padding: 2px 24px;
  732. background: #FFD489;
  733. border-radius: 4px;
  734. color: #000;
  735. }
  736. }
  737. }
  738. .legend{
  739. position: fixed;
  740. bottom: 8px;
  741. right: 64px;
  742. width: 525px;
  743. height: 16px;
  744. }
  745. }
  746. }
  747. .bottom-map {
  748. width: 100%;
  749. height: 100vh;
  750. position: absolute;
  751. z-index: 0;
  752. }
  753. </style>