index.vue 21 KB

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