index.vue 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075
  1. <template>
  2. <div class="dashboard-container">
  3. <!-- 顶部横幅 -->
  4. <div class="server_title">
  5. <el-image
  6. style="width: 824px; height: 786px"
  7. src="static/images/wgn_title.png"
  8. fit="cover"
  9. />
  10. <div class="server_title_text">
  11. <div class="server_title_text_title">时空门户</div>
  12. <div class="server_title_text_content">
  13. 时空门户子系统为用户提供信息概览、导航入口及交互功能,帮助用户快速了解和使用平台服务。系统统计访问量(累计和日均)、用户使用时长及活跃时段;展示平台功能、核心能力及操作演示视频;统计并展示服务总数、分类占比及新上线服务;同时统计各委办平台的注册用户信息及用户总数。
  14. </div>
  15. </div>
  16. </div>
  17. <!-- <div class="banner">
  18. <div class="banner-content">
  19. <h1>时空门户</h1>
  20. <p>时空门户是一个集数据采集、分析、展示于一体的综合性平台,为用户提供全面的设备监控和数据分析服务</p>
  21. <button class="enter-btn">进入系统</button>
  22. </div>
  23. </div> -->
  24. <!-- 平台数据统计 -->
  25. <div class="stats-section">
  26. <div class="overview-header">
  27. <h2>平台数据统计</h2>
  28. </div>
  29. <div class="stats-grid">
  30. <div class="stat-card card-1">
  31. <div class="stat-label">平台服务总数
  32. <el-image
  33. style="width: 20px; height: 20px"
  34. src="static/images/skmh-1.png"
  35. fit="cover"
  36. />
  37. </div>
  38. <div class="stat-number">1,248</div>
  39. <div class="stat-label">较上月增长12.5%</div>
  40. </div>
  41. <div class="stat-card card-2">
  42. <div class="stat-label">新上线服务统计
  43. <el-image
  44. style="width: 20px; height: 20px"
  45. src="static/images/skmh-2.png"
  46. fit="cover"
  47. />
  48. </div>
  49. <div class="stat-number">86</div>
  50. <div class="stat-label">本月新增服务</div>
  51. </div>
  52. <div class="stat-card card-3">
  53. <div class="stat-label">注册用户总数
  54. <el-image
  55. style="width: 20px; height: 20px"
  56. src="static/images/skmh-3.png"
  57. fit="cover"
  58. />
  59. </div>
  60. <div class="stat-number">24,586</div>
  61. <div class="stat-label">本周新增12,34人</div>
  62. </div>
  63. </div>
  64. </div>
  65. <!-- 数据概览 -->
  66. <div class="data-overview">
  67. <div class="overview-header">
  68. <h2>数据概览</h2>
  69. <!-- <div class="time-tabs">
  70. <div class="tab active">今日</div>
  71. <div class="tab">本周</div>
  72. <div class="tab">本月</div>
  73. <div class="tab">本年</div>
  74. </div> -->
  75. </div>
  76. <div class="time-section">
  77. <div class="time-card">
  78. <div class="time-content">
  79. <div style="">
  80. <el-date-picker
  81. class="el-date-picker"
  82. v-model="fromTime.date"
  83. type="daterange"
  84. range-separator="-"
  85. start-placeholder="开始日期"
  86. end-placeholder="结束日期"
  87. format="YYYY-MM-DD"
  88. @change="changeTime"
  89. />
  90. </div>
  91. <div class="button-row">
  92. <el-button type="primary" @click="handleType(7)">最近7天</el-button>
  93. <el-button type="primary" @click="handleType(30)">最近30天</el-button>
  94. <el-button type="primary" @click="handleType(90)">最近90天</el-button>
  95. <el-button type="primary" @click="handleType(365)">最近1年</el-button>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <div class="charts-grid">
  101. <!-- 访问量统计柱状图 -->
  102. <div class="chart-card">
  103. <div class="chart-title">访问量统计</div>
  104. <div ref="deviceChart" class="chart-container"></div>
  105. </div>
  106. <!-- 服务分类占比饼图 -->
  107. <div class="chart-card">
  108. <div class="chart-title">服务分类占比</div>
  109. <div ref="statusChart" class="chart-container"></div>
  110. </div>
  111. <!-- 用户活跃度分析折线图 -->
  112. <!-- <div class="chart-card">
  113. <div class="chart-title">用户活跃度分析</div>
  114. <div ref="activityChart" class="chart-container"></div>
  115. </div> -->
  116. <!-- 数据量柱状图 -->
  117. <!-- <div class="chart-card">
  118. <div class="chart-title">数据量</div>
  119. <div ref="dataVolumeChart" class="chart-container"></div>
  120. </div> -->
  121. </div>
  122. </div>
  123. <!-- 设备综合分析比较 -->
  124. <div class="comparison-section">
  125. <div class="chart-card full-width">
  126. <div class="chart-title">各委办平台用户分布</div>
  127. <!-- <div ref="comparisonChart" class="chart-container"></div> -->
  128. <el-table :data="tableData" style="width: 100%">
  129. <el-table-column prop="name" label="委办单位" />
  130. <el-table-column prop="number" label="注册用户数" />
  131. <el-table-column prop="activity" label="活跃度" />
  132. <el-table-column prop="server" label="服务使用量" />
  133. </el-table>
  134. </div>
  135. </div>
  136. <!-- 功能演示 -->
  137. <div class="demo-section">
  138. <div class="overview-header">
  139. <h2>功能演示</h2>
  140. </div>
  141. <div class="demo-grid">
  142. <div class="demo-card">
  143. <div class="demo-thumbnail">
  144. <div class="play-btn">▶</div>
  145. </div>
  146. <div class="demo-title">
  147. <div class="demo-label">核心功能操作演示</div>
  148. <div class="demo-text">展示系统核心功能操作流程与交互方式</div>
  149. </div>
  150. </div>
  151. <div class="demo-card">
  152. <div class="demo-thumbnail">
  153. <div class="play-btn">▶</div>
  154. </div>
  155. <div class="demo-title">
  156. <div class="demo-label">二三维一体化引擎</div>
  157. <div class="demo-text">展示空间数据可视化与交互分析能力</div>
  158. </div>
  159. </div>
  160. <div class="demo-card">
  161. <div class="demo-thumbnail">
  162. <div class="play-btn">▶</div>
  163. </div>
  164. <div class="demo-title">
  165. <div class="demo-label">实际业务场景应用</div>
  166. <div class="demo-text">展示系统在行业中的实际应用案例</div>
  167. </div>
  168. </div>
  169. </div>
  170. </div>
  171. </div>
  172. </template>
  173. <script>
  174. import * as echarts from 'echarts'
  175. export default {
  176. name: 'SpatialTemporalPortal',
  177. data() {
  178. return {
  179. deviceChart: null,
  180. statusChart: null,
  181. activityChart: null,
  182. dataVolumeChart: null,
  183. comparisonChart: null,
  184. fromTime:{
  185. date:[new Date(),new Date()]
  186. },
  187. tableData:[
  188. {
  189. number: '1234',
  190. name: 'tom',
  191. activity:'87',
  192. server: '2324',
  193. },
  194. {
  195. number: '1234',
  196. name: 'canver',
  197. activity:'78',
  198. server: '2324',
  199. },
  200. {
  201. number: '1234',
  202. name: 'lina',
  203. activity:'88',
  204. server: '2324',
  205. },
  206. {
  207. number: '1234',
  208. name: 'wang',
  209. activity:'86',
  210. server: '2324',
  211. },
  212. ]
  213. }
  214. },
  215. mounted() {
  216. this.initCharts()
  217. window.addEventListener('resize', this.handleResize)
  218. },
  219. beforeUnmount() {
  220. window.removeEventListener('resize', this.handleResize)
  221. this.destroyCharts()
  222. },
  223. methods: {
  224. initCharts() {
  225. this.initDeviceChart()
  226. this.initStatusChart()
  227. // this.initActivityChart()
  228. // this.initDataVolumeChart()
  229. // this.initComparisonChart()
  230. },
  231. handleType(param){
  232. const end = new Date()
  233. const start = new Date()
  234. start.setTime(start.getTime() - 3600 * 1000 * 24 * param) //天计算
  235. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1) //天计算
  236. // start.setMonth(start.getMonth() - 6)
  237. this.fromTime.date = [start,end]
  238. },
  239. changeTime(v){
  240. debugger
  241. console.log('[ eee ] >', v)
  242. this.fromTime.date=v
  243. },
  244. initDeviceChart() {
  245. this.deviceChart = echarts.init(this.$refs.deviceChart)
  246. const option = {
  247. tooltip: {
  248. trigger: 'item',
  249. backgroundColor: 'rgba(0, 25, 50, 0.8)',
  250. borderColor: '#1E90FF',
  251. textStyle: {
  252. color: '#fff'
  253. }
  254. },
  255. legend: {
  256. orient: 'horizontal',
  257. // bottom: 0,
  258. top:0,
  259. textStyle: {
  260. color: '#a3b6c7'
  261. }
  262. },
  263. grid: {
  264. left: '3%',
  265. right: '4%',
  266. bottom: '3%',
  267. containLabel: true
  268. },
  269. xAxis: {
  270. type: 'category',
  271. data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'],
  272. axisLabel: {
  273. color: '#a3b6c7'
  274. },
  275. axisLine: {
  276. lineStyle: {
  277. color: '#1E90FF'
  278. }
  279. }
  280. },
  281. yAxis: {
  282. type: 'value',
  283. axisLabel: {
  284. color: '#a3b6c7'
  285. },
  286. axisLine: {
  287. lineStyle: {
  288. color: '#1E90FF'
  289. }
  290. },
  291. splitLine: {
  292. lineStyle: {
  293. color: 'rgba(30, 144, 255, 0.2)'
  294. }
  295. }
  296. },
  297. series: [
  298. {
  299. data: [120, 200, 150, 80, 70, 110],
  300. type: 'bar',
  301. barWidth: '60%',
  302. itemStyle: {
  303. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  304. { offset: 0, color: '#1E90FF' },
  305. { offset: 1, color: '#00BFFF' }
  306. ])
  307. }
  308. }
  309. ]
  310. }
  311. this.deviceChart.setOption(option)
  312. },
  313. initStatusChart() {
  314. this.statusChart = echarts.init(this.$refs.statusChart)
  315. const option = {
  316. tooltip: {
  317. trigger: 'item',
  318. backgroundColor: 'rgba(0, 25, 50, 0.8)',
  319. borderColor: '#1E90FF',
  320. textStyle: {
  321. color: '#fff'
  322. }
  323. },
  324. legend: {
  325. orient: 'horizontal',
  326. bottom: 0,
  327. textStyle: {
  328. color: '#a3b6c7'
  329. }
  330. },
  331. series: [
  332. {
  333. name: '服务分类占比',
  334. type: 'pie',
  335. radius: ['40%', '70%'],
  336. avoidLabelOverlap: false,
  337. itemStyle: {
  338. borderRadius: 10,
  339. borderColor: '#0A192F',
  340. borderWidth: 2
  341. },
  342. label: {
  343. show: false,
  344. position: 'center'
  345. },
  346. emphasis: {
  347. label: {
  348. show: true,
  349. fontSize: 20,
  350. fontWeight: 'bold',
  351. color: '#fff'
  352. }
  353. },
  354. labelLine: {
  355. show: false
  356. },
  357. data: [
  358. { value: 400, name: '空间分析', itemStyle: { color: '#52C41A' } },
  359. { value: 300, name: '数据查询', itemStyle: { color: '#FAAD14' } },
  360. { value: 200, name: '三维可视化', itemStyle: { color: '#F5222D' } },
  361. { value: 100, name: '路径规划', itemStyle: { color: '#8C8C8C' } }
  362. ]
  363. }
  364. ]
  365. }
  366. this.statusChart.setOption(option)
  367. },
  368. initActivityChart() {
  369. this.activityChart = echarts.init(this.$refs.activityChart)
  370. const option = {
  371. tooltip: {
  372. trigger: 'axis',
  373. backgroundColor: 'rgba(0, 25, 50, 0.8)',
  374. borderColor: '#1E90FF',
  375. textStyle: {
  376. color: '#fff'
  377. }
  378. },
  379. grid: {
  380. left: '3%',
  381. right: '4%',
  382. bottom: '3%',
  383. containLabel: true
  384. },
  385. xAxis: {
  386. type: 'category',
  387. boundaryGap: false,
  388. data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'],
  389. axisLabel: {
  390. color: '#a3b6c7'
  391. },
  392. axisLine: {
  393. lineStyle: {
  394. color: '#1E90FF'
  395. }
  396. }
  397. },
  398. yAxis: {
  399. type: 'value',
  400. axisLabel: {
  401. color: '#a3b6c7'
  402. },
  403. axisLine: {
  404. lineStyle: {
  405. color: '#1E90FF'
  406. }
  407. },
  408. splitLine: {
  409. lineStyle: {
  410. color: 'rgba(30, 144, 255, 0.2)'
  411. }
  412. }
  413. },
  414. series: [
  415. {
  416. name: '活跃度',
  417. type: 'line',
  418. stack: 'Total',
  419. smooth: true,
  420. lineStyle: {
  421. color: '#1E90FF'
  422. },
  423. areaStyle: {
  424. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  425. { offset: 0, color: 'rgba(30, 144, 255, 0.6)' },
  426. { offset: 1, color: 'rgba(30, 144, 255, 0.1)' }
  427. ])
  428. },
  429. emphasis: {
  430. focus: 'series'
  431. },
  432. data: [120, 132, 101, 134, 90, 230]
  433. }
  434. ]
  435. }
  436. this.activityChart.setOption(option)
  437. },
  438. initDataVolumeChart() {
  439. this.dataVolumeChart = echarts.init(this.$refs.dataVolumeChart)
  440. const option = {
  441. tooltip: {
  442. trigger: 'axis',
  443. backgroundColor: 'rgba(0, 25, 50, 0.8)',
  444. borderColor: '#1E90FF',
  445. textStyle: {
  446. color: '#fff'
  447. }
  448. },
  449. grid: {
  450. left: '3%',
  451. right: '4%',
  452. bottom: '3%',
  453. containLabel: true
  454. },
  455. xAxis: {
  456. type: 'category',
  457. data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
  458. axisLabel: {
  459. color: '#a3b6c7'
  460. },
  461. axisLine: {
  462. lineStyle: {
  463. color: '#1E90FF'
  464. }
  465. }
  466. },
  467. yAxis: {
  468. type: 'value',
  469. axisLabel: {
  470. color: '#a3b6c7'
  471. },
  472. axisLine: {
  473. lineStyle: {
  474. color: '#1E90FF'
  475. }
  476. },
  477. splitLine: {
  478. lineStyle: {
  479. color: 'rgba(30, 144, 255, 0.2)'
  480. }
  481. }
  482. },
  483. series: [
  484. {
  485. data: [1200, 2000, 1500, 800, 700, 1100, 1300],
  486. type: 'bar',
  487. barWidth: '60%',
  488. itemStyle: {
  489. color: '#FF7F50'
  490. }
  491. }
  492. ]
  493. }
  494. this.dataVolumeChart.setOption(option)
  495. },
  496. initComparisonChart() {
  497. this.comparisonChart = echarts.init(this.$refs.comparisonChart)
  498. const option = {
  499. tooltip: {
  500. trigger: 'axis',
  501. backgroundColor: 'rgba(0, 25, 50, 0.8)',
  502. borderColor: '#1E90FF',
  503. textStyle: {
  504. color: '#fff'
  505. }
  506. },
  507. legend: {
  508. data: ['设备A', '设备B', '设备C'],
  509. textStyle: {
  510. color: '#a3b6c7'
  511. }
  512. },
  513. grid: {
  514. left: '3%',
  515. right: '4%',
  516. bottom: '3%',
  517. containLabel: true
  518. },
  519. xAxis: {
  520. type: 'category',
  521. boundaryGap: false,
  522. data: ['00:00', '04:00', '08:00', '12:00', '16:00', '20:00'],
  523. axisLabel: {
  524. color: '#a3b6c7'
  525. },
  526. axisLine: {
  527. lineStyle: {
  528. color: '#1E90FF'
  529. }
  530. }
  531. },
  532. yAxis: {
  533. type: 'value',
  534. axisLabel: {
  535. color: '#a3b6c7'
  536. },
  537. axisLine: {
  538. lineStyle: {
  539. color: '#1E90FF'
  540. }
  541. },
  542. splitLine: {
  543. lineStyle: {
  544. color: 'rgba(30, 144, 255, 0.2)'
  545. }
  546. }
  547. },
  548. series: [
  549. {
  550. name: '设备A',
  551. type: 'line',
  552. stack: 'Total',
  553. smooth: true,
  554. lineStyle: {
  555. color: '#1E90FF'
  556. },
  557. areaStyle: {
  558. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  559. { offset: 0, color: 'rgba(30, 144, 255, 0.6)' },
  560. { offset: 1, color: 'rgba(30, 144, 255, 0.1)' }
  561. ])
  562. },
  563. data: [120, 132, 101, 134, 90, 230]
  564. },
  565. {
  566. name: '设备B',
  567. type: 'line',
  568. stack: 'Total',
  569. smooth: true,
  570. lineStyle: {
  571. color: '#52C41A'
  572. },
  573. areaStyle: {
  574. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  575. { offset: 0, color: 'rgba(82, 196, 26, 0.6)' },
  576. { offset: 1, color: 'rgba(82, 196, 26, 0.1)' }
  577. ])
  578. },
  579. data: [220, 182, 191, 234, 290, 330]
  580. },
  581. {
  582. name: '设备C',
  583. type: 'line',
  584. stack: 'Total',
  585. smooth: true,
  586. lineStyle: {
  587. color: '#FF7F50'
  588. },
  589. areaStyle: {
  590. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  591. { offset: 0, color: 'rgba(255, 127, 80, 0.6)' },
  592. { offset: 1, color: 'rgba(255, 127, 80, 0.1)' }
  593. ])
  594. },
  595. data: [150, 232, 201, 154, 190, 330]
  596. }
  597. ]
  598. }
  599. this.comparisonChart.setOption(option)
  600. },
  601. handleResize() {
  602. if (this.deviceChart) this.deviceChart.resize()
  603. if (this.statusChart) this.statusChart.resize()
  604. if (this.activityChart) this.activityChart.resize()
  605. if (this.dataVolumeChart) this.dataVolumeChart.resize()
  606. if (this.comparisonChart) this.comparisonChart.resize()
  607. },
  608. destroyCharts() {
  609. if (this.deviceChart) {
  610. this.deviceChart.dispose()
  611. this.deviceChart = null
  612. }
  613. if (this.statusChart) {
  614. this.statusChart.dispose()
  615. this.statusChart = null
  616. }
  617. if (this.activityChart) {
  618. this.activityChart.dispose()
  619. this.activityChart = null
  620. }
  621. if (this.dataVolumeChart) {
  622. this.dataVolumeChart.dispose()
  623. this.dataVolumeChart = null
  624. }
  625. if (this.comparisonChart) {
  626. this.comparisonChart.dispose()
  627. this.comparisonChart = null
  628. }
  629. }
  630. }
  631. }
  632. </script>
  633. <style lang="less" scoped>
  634. /* 确保你的自定义样式优先级更高 */
  635. .el-date-picker {
  636. /* 重置为期望的样式 */
  637. color: initial !important; /* 使用 !important 来确保优先级 */
  638. background-color: white !important; /* 确保背景色正确 */
  639. }
  640. .dashboard-container {
  641. background-color: #0A192F;
  642. min-height: 100vh;
  643. color: #fff;
  644. }
  645. .server_title {
  646. display: flex;
  647. justify-content: center;
  648. align-items: center;
  649. }
  650. .server_title_text {
  651. width: calc(100vw - 824px);
  652. height: 786px;
  653. background-color: #1c2631;
  654. color: #fff;
  655. padding: 0 160px 0 60px;
  656. display: flex;
  657. flex-direction: column;
  658. justify-content: center;
  659. overflow: hidden;
  660. &_title {
  661. font-size: 64px;
  662. font-weight: bold;
  663. letter-spacing: 0.5rem;
  664. }
  665. &_content {
  666. margin-top: 77px;
  667. font-size: 22px;
  668. }
  669. }
  670. /* 顶部横幅 */
  671. .banner {
  672. position: relative;
  673. height: 500px;
  674. background: url('@/assets/images/common/home-bg1.png') center/cover no-repeat;
  675. display: flex;
  676. align-items: center;
  677. justify-content: flex-end;
  678. padding-right: 10%;
  679. &::before {
  680. content: '';
  681. position: absolute;
  682. top: 0;
  683. left: 0;
  684. right: 0;
  685. bottom: 0;
  686. background: linear-gradient(to right, rgba(10, 25, 47, 0.9), rgba(10, 25, 47, 0.7));
  687. }
  688. .banner-content {
  689. position: relative;
  690. max-width: 600px;
  691. text-align: left;
  692. padding: 0 20px;
  693. h1 {
  694. font-size: 42px;
  695. font-weight: bold;
  696. margin-bottom: 20px;
  697. color: #fff;
  698. }
  699. p {
  700. font-size: 14px;
  701. line-height: 1.8;
  702. margin-bottom: 30px;
  703. color: #a3b6c7;
  704. }
  705. .enter-btn {
  706. background-color: transparent;
  707. color: #409eff;
  708. border: 1px solid #409eff;
  709. padding: 8px 30px;
  710. font-size: 16px;
  711. border-radius: 20px;
  712. cursor: pointer;
  713. transition: all 0.3s ease;
  714. &:hover {
  715. background-color: #409eff;
  716. color: #fff;
  717. transform: translateY(-2px);
  718. }
  719. }
  720. }
  721. }
  722. /* 平台数据统计 */
  723. .stats-section {
  724. padding: 40px 20px;
  725. .overview-header {
  726. display: flex;
  727. justify-content: space-between;
  728. align-items: center;
  729. margin-bottom: 30px;
  730. h2 {
  731. font-size: 24px;
  732. color: #fff;
  733. margin: 0;
  734. }
  735. }
  736. .stats-grid {
  737. display: flex;
  738. justify-content: center;
  739. gap: 30px;
  740. flex-wrap: wrap;
  741. .stat-card {
  742. width: 555px;
  743. height: 150px;
  744. border-radius: 12px;
  745. padding: 20px;
  746. display: flex;
  747. flex-direction: column;
  748. justify-content: center;
  749. align-items: flex-start;
  750. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
  751. transition: transform 0.3s ease;
  752. &:hover {
  753. transform: translateY(-5px);
  754. }
  755. .stat-number {
  756. font-size: 36px;
  757. font-weight: bold;
  758. margin-top: 10px;
  759. margin-bottom: 10px;
  760. color: #fff;
  761. }
  762. .stat-label {
  763. font-size: 16px;
  764. color: rgba(255, 255, 255, 0.8);
  765. width: 100%;
  766. justify-content: space-between;
  767. display: flex;
  768. }
  769. }
  770. .card-1 {
  771. background: linear-gradient(135deg, #3B82F6 0%, #4F46E5 100%);
  772. }
  773. .card-2 {
  774. background: linear-gradient(135deg, #22C55E 0%, #059669 100%);
  775. }
  776. .card-3 {
  777. background: linear-gradient(135deg, #A855F7 0%, #7C3AED 100%);
  778. }
  779. }
  780. }
  781. /* 数据概览 */
  782. .data-overview {
  783. padding: 0 20px 40px;
  784. .overview-header {
  785. display: flex;
  786. justify-content: space-between;
  787. align-items: center;
  788. margin-bottom: 30px;
  789. h2 {
  790. font-size: 24px;
  791. color: #fff;
  792. margin: 0;
  793. }
  794. .time-tabs {
  795. display: flex;
  796. gap: 20px;
  797. .tab {
  798. padding: 8px 16px;
  799. cursor: pointer;
  800. color: #a3b6c7;
  801. border-radius: 20px;
  802. transition: all 0.3s ease;
  803. &:hover {
  804. color: #409eff;
  805. }
  806. &.active {
  807. background-color: #409eff;
  808. color: #fff;
  809. }
  810. }
  811. }
  812. }
  813. .charts-grid {
  814. display: grid;
  815. grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
  816. gap: 30px;
  817. .chart-card {
  818. background-color: rgba(30, 41, 59, 0.6);
  819. border-radius: 12px;
  820. padding: 20px;
  821. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
  822. .chart-title {
  823. font-size: 18px;
  824. color: #fff;
  825. margin-bottom: 20px;
  826. text-align: left;
  827. }
  828. .chart-container {
  829. height: 300px;
  830. width: 100%;
  831. }
  832. }
  833. }
  834. }
  835. // 时间筛选
  836. .time-section{
  837. padding: 0 0px 40px;
  838. .time-card {
  839. background-color: rgba(30, 41, 59, 0.6);
  840. border-radius: 12px;
  841. padding: 20px;
  842. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
  843. }
  844. .time-content{
  845. display: flex;
  846. justify-content: space-between;
  847. width: 100%;
  848. }
  849. }
  850. /* 设备综合分析比较 */
  851. .comparison-section {
  852. padding: 0 20px 40px;
  853. .chart-card {
  854. background-color: rgba(30, 41, 59, 0.6);
  855. border-radius: 12px;
  856. padding: 20px;
  857. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
  858. &.full-width {
  859. max-width: 100%;
  860. }
  861. .chart-title {
  862. font-size: 18px;
  863. color: #fff;
  864. margin-bottom: 20px;
  865. text-align: left;
  866. }
  867. .chart-container {
  868. height: 400px;
  869. width: 100%;
  870. }
  871. }
  872. }
  873. /* 功能演示 */
  874. .demo-section {
  875. padding: 0 20px 100px;
  876. .overview-header {
  877. display: flex;
  878. justify-content: space-between;
  879. align-items: center;
  880. margin-bottom: 30px;
  881. h2 {
  882. font-size: 24px;
  883. color: #fff;
  884. margin: 0;
  885. }
  886. }
  887. .demo-grid {
  888. display: flex;
  889. justify-content: space-between;
  890. gap: 30px;
  891. flex-wrap: wrap;
  892. .demo-card {
  893. width: 350px;
  894. background-color: rgba(30, 41, 59, 0.6);
  895. border-radius: 12px;
  896. overflow: hidden;
  897. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
  898. transition: transform 0.3s ease;
  899. &:hover {
  900. transform: translateY(-5px);
  901. }
  902. .demo-thumbnail {
  903. height: 200px;
  904. background-color: #1E90FF;
  905. position: relative;
  906. display: flex;
  907. justify-content: center;
  908. align-items: center;
  909. .play-btn {
  910. width: 60px;
  911. height: 60px;
  912. border-radius: 50%;
  913. background-color: rgba(255, 255, 255, 0.8);
  914. color: #1E90FF;
  915. font-size: 30px;
  916. display: flex;
  917. justify-content: center;
  918. align-items: center;
  919. cursor: pointer;
  920. transition: all 0.3s ease;
  921. &:hover {
  922. background-color: #fff;
  923. transform: scale(1.1);
  924. }
  925. }
  926. }
  927. .demo-title {
  928. padding: 15px;
  929. color: #fff;
  930. text-align: left;
  931. }
  932. .demo-label {
  933. font-size: 16px;
  934. color: #fff;
  935. padding-bottom: 10px;
  936. text-align: left;
  937. }
  938. .demo-text {
  939. font-size: 12px;
  940. color: #fff;
  941. text-align: left;
  942. }
  943. }
  944. }
  945. }
  946. /* 响应式设计 */
  947. @media (max-width: 768px) {
  948. .banner {
  949. padding-right: 5%;
  950. .banner-content {
  951. h1 {
  952. font-size: 32px;
  953. }
  954. }
  955. }
  956. .stats-section {
  957. .stats-grid {
  958. gap: 20px;
  959. .stat-card {
  960. width: 100%;
  961. max-width: 300px;
  962. }
  963. }
  964. }
  965. .data-overview {
  966. .overview-header {
  967. flex-direction: column;
  968. gap: 20px;
  969. h2 {
  970. text-align: center;
  971. }
  972. }
  973. .charts-grid {
  974. grid-template-columns: 1fr;
  975. .chart-card {
  976. .chart-container {
  977. height: 250px;
  978. }
  979. }
  980. }
  981. }
  982. .comparison-section {
  983. .chart-card {
  984. .chart-container {
  985. height: 300px;
  986. }
  987. }
  988. }
  989. .demo-section {
  990. .demo-grid {
  991. gap: 20px;
  992. .demo-card {
  993. width: 100%;
  994. max-width: 350px;
  995. }
  996. }
  997. }
  998. }
  999. </style>