heavyMetalEnterprise.vue 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. <template>
  2. <div class="page-container">
  3. <!-- 页面标题区域 -->
  4. <div class="header-section">
  5. <div class="header-content">
  6. <div class="section-icon">📊</div>
  7. <h1 class="system-title">韶关市涉重企业重金属排放调查</h1>
  8. </div>
  9. </div>
  10. <!-- 地图展示区域 -->
  11. <div class="dashboard-section ">
  12. <div class="section-header">
  13. <div class="section-icon">🗺️</div>
  14. <h2 class="section-title">涉重企业地理分布</h2>
  15. </div>
  16. <div class="map-container">
  17. <div class="map-holder">
  18. <atmcompanymap/>
  19. </div>
  20. </div>
  21. </div>
  22. <!-- 数据展示区域 - 上下排列 -->
  23. <div class="data-section">
  24. <!-- 企业数据列表 -->
  25. <div class="dashboard-section table-section">
  26. <div class="section-header">
  27. <div class="section-icon">📋</div>
  28. <h2 class="section-title">涉重企业数据列表</h2>
  29. <div class="data-info">
  30. <span class="info-item">数据更新时间: 2025-08-16</span>
  31. </div>
  32. </div>
  33. <div class="data-card">
  34. <div class="table-container">
  35. <atmcompanyline/>
  36. </div>
  37. </div>
  38. </div>
  39. <!-- 排放分析图表 -->
  40. <div class="dashboard-section chart-section">
  41. <div class="section-header">
  42. <div class="section-icon">📊</div>
  43. <h2 class="section-title">大气颗粒物排放统计</h2>
  44. <div class="emission-info">
  45. <span class="info-item">单位: 吨/年 (t/a)</span>
  46. <span class="info-item">统计周期: 2025年</span>
  47. </div>
  48. </div>
  49. <div class="chart-card">
  50. <div class="chart-header">
  51. <h3>各区县企业平均大气颗粒物排放量</h3>
  52. </div>
  53. <div class="chart-container">
  54. <HeavyMetalEnterprisechart/>
  55. </div>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </template>
  61. <script setup>
  62. import atmcompanyline from '@/components/atmpollution/atmcompanyline.vue';
  63. import atmcompanymap from '@/components/atmpollution/atmcompanymap.vue';
  64. import HeavyMetalEnterprisechart from '@/components/atmpollution/heavyMetalEnterprisechart.vue';
  65. </script>
  66. <style scoped>
  67. /* 基础样式重置 */
  68. .page-container {
  69. display: flex;
  70. flex-direction: column;
  71. min-height: 100vh;
  72. background: linear-gradient(135deg, #f0f9ff 0%, #e9ecef 100%);
  73. padding: 25px;
  74. gap: 20px;
  75. position: relative;
  76. overflow-x: hidden;
  77. }
  78. /* 页眉区域 */
  79. .header-section {
  80. display: flex;
  81. align-items: center;
  82. gap: 15px;
  83. margin-bottom: 20px;
  84. position: relative;
  85. }
  86. .header-content {
  87. display: flex;
  88. justify-content: space-between;
  89. align-items: center;
  90. }
  91. .system-title {
  92. font-size: 2.2rem;
  93. font-weight: 700;
  94. color: #1a365d;
  95. margin: 0;
  96. position: relative;
  97. padding-left: 15px;
  98. flex-grow: 1;
  99. }
  100. .system-title::after {
  101. content: "";
  102. position: absolute;
  103. bottom: -8px;
  104. left: 0;
  105. width: 100px;
  106. height: 4px;
  107. background: linear-gradient(90deg, #4a9ef7, #3acfd5);
  108. border-radius: 2px;
  109. }
  110. .header-actions {
  111. display: flex;
  112. gap: 15px;
  113. }
  114. .action-btn {
  115. display: flex;
  116. align-items: center;
  117. gap: 8px;
  118. padding: 10px 20px;
  119. background: rgba(255, 255, 255, 0.15);
  120. color: white;
  121. border: 1px solid rgba(255, 255, 255, 极 0.3);
  122. border-radius: 8px;
  123. font-size: 1rem;
  124. font-weight: 500;
  125. cursor: pointer;
  126. transition: all 0.3s ease;
  127. }
  128. .action-btn:hover {
  129. background: rgba(255, 255, 255, 0.25);
  130. transform: translateY(-3px);
  131. }
  132. .btn-icon {
  133. font-size: 1.2rem;
  134. }
  135. .header-stats {
  136. display: flex;
  137. gap: 20px;
  138. }
  139. .stat-card {
  140. flex: 1;
  141. display: flex;
  142. align-items: center;
  143. gap: 15px;
  144. background: rgba(255, 255, 255, 0.1);
  145. border-radius: 12px;
  146. padding: 15极 px;
  147. backdrop-filter: blur(5px);
  148. border: 1px solid rgba(255, 255, 255, 0.1);
  149. }
  150. .stat-icon {
  151. font-size: 2.5rem;
  152. color: #4a9ef7;
  153. }
  154. .stat-info {
  155. flex: 1;
  156. }
  157. .stat-value {
  158. font-size: 2.2rem;
  159. font-weight: 700;
  160. color: white;
  161. line-height: 1.2;
  162. }
  163. .stat-label {
  164. font-size: 1rem;
  165. color: #cbd5e0;
  166. font-weight: 500;
  167. }
  168. /* 地图区域 */
  169. .dashboard-section {
  170. margin-bottom: 20px;
  171. }
  172. .section-header {
  173. display: flex;
  174. align-items: center;
  175. gap: 15px;
  176. margin-bottom: 20px;
  177. }
  178. .section-icon {
  179. font-size: 2.2rem;
  180. color: #3a9fd3;
  181. }
  182. .section-title {
  183. font-size: 1.8rem;
  184. font-weight: 600;
  185. color: #1a365d;
  186. margin: 0;
  187. position: relative;
  188. padding-left: 10px;
  189. }
  190. .section-title::before {
  191. content: "";
  192. position: absolute;
  193. left: 0;
  194. top: 50%;
  195. transform: translateY(-50%);
  196. width: 4px;
  197. height: 80%;
  198. background: linear-gradient(to bottom, #4a9ef7, #3acfd5);
  199. border-radius: 2px;
  200. }
  201. .map-controls {
  202. margin-left: auto;
  203. display: flex;
  204. align-items: center;
  205. gap: 10px;
  206. }
  207. .control-label {
  208. font-size: 0.9rem;
  209. color: #4a5568;
  210. }
  211. .control-select {
  212. padding: 8px 12px;
  213. border: 1px solid #cbd5e0;
  214. border-radius: 6px;
  215. background: white;
  216. font-size: 0.9rem;
  217. }
  218. .map-container {
  219. position: relative;
  220. height: 550px;
  221. border-radius: 12px;
  222. overflow: hidden;
  223. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  224. }
  225. .map-holder {
  226. position: relative;
  227. height: 100%;
  228. z-index: 100;
  229. }
  230. .map-legend {
  231. position: absolute;
  232. bottom: 20px;
  233. left: 20px;
  234. z-index: 200;
  235. display: flex;
  236. gap: 15px;
  237. background: rgba(255, 255, 255, 0.9);
  238. border-radius: 8px;
  239. padding: 10px 15px;
  240. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  241. }
  242. .legend-item {
  243. display: flex;
  244. align-items: center;
  245. gap: 8px;
  246. }
  247. .legend-color {
  248. width: 20px;
  249. height: 20px;
  250. border-radius: 4px;
  251. }
  252. .high-risk { background-color: #e53e3e; }
  253. .medium-risk { background-color: #dd6b20; }
  254. .low-risk { background-color: #38a169; }
  255. /* 数据展示区域 - 上下排列 */
  256. .data-section {
  257. display: flex;
  258. flex-direction: column;
  259. gap: 30px;
  260. }
  261. /* 企业数据列表 - 固定高度滚动条 */
  262. .data-card {
  263. height: 450px;
  264. background: white;
  265. border-radius: 16px;
  266. box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
  267. overflow: hidden;
  268. display: flex;
  269. flex-direction: column;
  270. }
  271. .table-container {
  272. height: 100%;
  273. overflow-y: auto;
  274. padding: 15px;
  275. }
  276. /* 图表区域 - 固定高度 */
  277. .chart-card {
  278. height: 600px;
  279. padding: 20px;
  280. background: white;
  281. border-radius: 16px;
  282. box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
  283. display: flex;
  284. flex-direction: column;
  285. }
  286. .chart-container {
  287. flex: 1;
  288. min-height: 0; /* 修复flex容器滚动问题 */
  289. }
  290. .data-info, .emission-info {
  291. display: flex;
  292. gap: 20px;
  293. margin-left: 30px;
  294. font-size: 0.9rem;
  295. color: #4a5568;
  296. }
  297. .chart-header {
  298. margin-bottom: 15px;
  299. padding-bottom: 10px;
  300. border-bottom: 1px solid #e2e8f0;
  301. }
  302. .chart-header h3 {
  303. font-size: 1.4rem;
  304. color: #1a365d;
  305. margin: 0 0 5px 0;
  306. }
  307. .chart-header p {
  308. font-size: 1rem;
  309. color: #718096;
  310. margin: 0;
  311. }
  312. .chart-legend {
  313. display: flex;
  314. justify-content: center;
  315. margin-top: 15px;
  316. padding-top: 10px;
  317. border-top: 1px solid #e2e8f0;
  318. }
  319. .legend-item .primary {
  320. background-color: #3182ce;
  321. }
  322. /* 页脚区域 */
  323. .footer-section {
  324. margin-top: 30px;
  325. padding: 20px 0;
  326. text-align: center;
  327. color: #546e7a;
  328. font-size: 1rem;
  329. border-top: 1px solid #e2e8f0;
  330. }
  331. .footer-links {
  332. display: flex;
  333. justify-content: center;
  334. gap: 30px;
  335. margin-top: 10px;
  336. font-size: 0.9rem;
  337. color: #718096;
  338. }
  339. /* 响应式设计 */
  340. @media (max-width: 1200px) {
  341. .header-stats {
  342. flex-wrap: wrap;
  343. }
  344. .stat-card {
  345. flex: 0 0 calc(50% - 10px);
  346. margin-bottom: 10px;
  347. }
  348. }
  349. @media (max-width: 900px) {
  350. .header-content {
  351. flex-direction: column;
  352. align-items: flex-start;
  353. gap: 15px;
  354. }
  355. .header-actions {
  356. width: 100%;
  357. justify-content: flex-end;
  358. }
  359. .system-title {
  360. font-size: 2rem;
  361. }
  362. .section-title {
  363. font-size: 1.6rem;
  364. }
  365. }
  366. @media (max-width: 768px) {
  367. .page-container {
  368. padding: 15px;
  369. gap: 20px;
  370. }
  371. .map-container {
  372. height: 450px;
  373. }
  374. .data-card, .chart-card {
  375. height: 350px;
  376. }
  377. .section-header {
  378. flex-wrap: wrap;
  379. }
  380. .map-controls {
  381. margin-top: 10px;
  382. width: 100%;
  383. }
  384. .data-info, .emission-info {
  385. margin-left: 0;
  386. margin-top: 10px;
  387. width: 100%;
  388. }
  389. }
  390. @media (max-width: 480px) {
  391. .system-title {
  392. font-size: 1.8rem;
  393. }
  394. .section-title {
  395. font-size: 1.4rem;
  396. }
  397. .map-container {
  398. height: 400px;
  399. }
  400. .data-card, .chart-card {
  401. height: 300px;
  402. }
  403. .footer-links {
  404. flex-direction: column;
  405. gap: 5px;
  406. }
  407. .header-stats {
  408. gap: 10px;
  409. }
  410. .stat-card {
  411. flex: 0 0 100%;
  412. }
  413. }
  414. </style>