dashboard.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. <!DOCTYPE html>
  2. <html lang="zh-CN" class="iframe-content">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>首页 - 爱智农</title>
  7. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css">
  8. <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
  9. <style>
  10. body {
  11. font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
  12. background-color: #f5f7f9;
  13. color: #333;
  14. }
  15. .card {
  16. background-color: white;
  17. border-radius: 8px;
  18. box-shadow: 0 2px 8px rgba(0,0,0,0.05);
  19. transition: all 0.3s;
  20. }
  21. .card:hover {
  22. box-shadow: 0 4px 12px rgba(0,0,0,0.1);
  23. transform: translateY(-2px);
  24. }
  25. .stat-card {
  26. position: relative;
  27. overflow: hidden;
  28. }
  29. .stat-card .icon {
  30. position: absolute;
  31. right: 20px;
  32. top: 20px;
  33. font-size: 48px;
  34. opacity: 0.1;
  35. }
  36. .chart-container {
  37. height: 300px;
  38. width: 100%;
  39. }
  40. .weather-card {
  41. background: linear-gradient(135deg, #4CAF50, #2E7D32);
  42. color: white;
  43. }
  44. </style>
  45. </head>
  46. <body>
  47. <div class="p-6">
  48. <div class="mb-6">
  49. <h1 class="text-2xl font-bold mb-2">智慧农业概览</h1>
  50. <p class="text-gray-500">欢迎回来,管理员!今天是 <span id="current-date"></span></p>
  51. </div>
  52. <!-- 统计卡片 -->
  53. <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6">
  54. <div class="card stat-card p-6">
  55. <div class="icon">🌱</div>
  56. <h3 class="text-gray-500 mb-2">种植面积</h3>
  57. <div class="text-3xl font-bold">2,560<span class="text-lg ml-1">亩</span></div>
  58. <div class="text-green-500 mt-2">↑ 5.2% 较上月</div>
  59. </div>
  60. <div class="card stat-card p-6">
  61. <div class="icon">🚜</div>
  62. <h3 class="text-gray-500 mb-2">农机设备</h3>
  63. <div class="text-3xl font-bold">128<span class="text-lg ml-1">台</span></div>
  64. <div class="text-green-500 mt-2">↑ 3.1% 较上月</div>
  65. </div>
  66. <div class="card stat-card p-6">
  67. <div class="icon">👨‍🌾</div>
  68. <h3 class="text-gray-500 mb-2">农事人员</h3>
  69. <div class="text-3xl font-bold">86<span class="text-lg ml-1">人</span></div>
  70. <div class="text-gray-500 mt-2">持平 较上月</div>
  71. </div>
  72. <div class="card stat-card p-6">
  73. <div class="icon">📊</div>
  74. <h3 class="text-gray-500 mb-2">农作产量</h3>
  75. <div class="text-3xl font-bold">1,850<span class="text-lg ml-1">吨</span></div>
  76. <div class="text-green-500 mt-2">↑ 7.8% 较上年同期</div>
  77. </div>
  78. </div>
  79. <!-- 天气和告警 -->
  80. <div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
  81. <div class="card weather-card p-6">
  82. <div class="flex justify-between items-center mb-4">
  83. <h3 class="font-bold">今日天气</h3>
  84. <span>晴朗</span>
  85. </div>
  86. <div class="flex items-center justify-between">
  87. <div class="text-4xl font-bold">26°C</div>
  88. <div class="text-5xl">☀️</div>
  89. </div>
  90. <div class="mt-4 grid grid-cols-4 gap-2 text-center">
  91. <div>
  92. <div class="text-xs opacity-80">湿度</div>
  93. <div>65%</div>
  94. </div>
  95. <div>
  96. <div class="text-xs opacity-80">风速</div>
  97. <div>3km/h</div>
  98. </div>
  99. <div>
  100. <div class="text-xs opacity-80">气压</div>
  101. <div>1013hPa</div>
  102. </div>
  103. <div>
  104. <div class="text-xs opacity-80">降水</div>
  105. <div>0mm</div>
  106. </div>
  107. </div>
  108. </div>
  109. <div class="card p-6 col-span-2">
  110. <h3 class="font-bold mb-4">最近告警</h3>
  111. <div class="overflow-x-auto">
  112. <table class="min-w-full">
  113. <thead>
  114. <tr class="border-b">
  115. <th class="text-left pb-2">类型</th>
  116. <th class="text-left pb-2">位置</th>
  117. <th class="text-left pb-2">时间</th>
  118. <th class="text-left pb-2">状态</th>
  119. </tr>
  120. </thead>
  121. <tbody>
  122. <tr class="border-b">
  123. <td class="py-2"><span class="bg-red-100 text-red-800 px-2 py-1 rounded text-xs">设备故障</span></td>
  124. <td>东区3号地块</td>
  125. <td>10:25</td>
  126. <td><span class="text-red-500">未处理</span></td>
  127. </tr>
  128. <tr class="border-b">
  129. <td class="py-2"><span class="bg-yellow-100 text-yellow-800 px-2 py-1 rounded text-xs">土壤湿度</span></td>
  130. <td>西区1号地块</td>
  131. <td>09:12</td>
  132. <td><span class="text-green-500">已处理</span></td>
  133. </tr>
  134. <tr class="border-b">
  135. <td class="py-2"><span class="bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs">水位预警</span></td>
  136. <td>南区灌溉系统</td>
  137. <td>昨天</td>
  138. <td><span class="text-green-500">已处理</span></td>
  139. </tr>
  140. <tr>
  141. <td class="py-2"><span class="bg-purple-100 text-purple-800 px-2 py-1 rounded text-xs">病虫害</span></td>
  142. <td>北区2号地块</td>
  143. <td>昨天</td>
  144. <td><span class="text-green-500">已处理</span></td>
  145. </tr>
  146. </tbody>
  147. </table>
  148. </div>
  149. </div>
  150. </div>
  151. <!-- 图表 -->
  152. <div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
  153. <div class="card p-6">
  154. <h3 class="font-bold mb-4">作物分布</h3>
  155. <div id="cropDistribution" class="chart-container"></div>
  156. </div>
  157. <div class="card p-6">
  158. <h3 class="font-bold mb-4">月度产量趋势</h3>
  159. <div id="yieldTrend" class="chart-container"></div>
  160. </div>
  161. </div>
  162. <!-- 农事进度 -->
  163. <div class="card p-6">
  164. <h3 class="font-bold mb-4">农事进度</h3>
  165. <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
  166. <div>
  167. <div class="flex justify-between mb-2">
  168. <span>水稻种植</span>
  169. <span class="text-green-500">75%</span>
  170. </div>
  171. <div class="w-full bg-gray-200 rounded-full h-2.5">
  172. <div class="bg-green-500 h-2.5 rounded-full" style="width: 75%"></div>
  173. </div>
  174. </div>
  175. <div>
  176. <div class="flex justify-between mb-2">
  177. <span>小麦收割</span>
  178. <span class="text-green-500">90%</span>
  179. </div>
  180. <div class="w-full bg-gray-200 rounded-full h-2.5">
  181. <div class="bg-green-500 h-2.5 rounded-full" style="width: 90%"></div>
  182. </div>
  183. </div>
  184. <div>
  185. <div class="flex justify-between mb-2">
  186. <span>玉米播种</span>
  187. <span class="text-green-500">45%</span>
  188. </div>
  189. <div class="w-full bg-gray-200 rounded-full h-2.5">
  190. <div class="bg-green-500 h-2.5 rounded-full" style="width: 45%"></div>
  191. </div>
  192. </div>
  193. <div>
  194. <div class="flex justify-between mb-2">
  195. <span>果树修剪</span>
  196. <span class="text-green-500">60%</span>
  197. </div>
  198. <div class="w-full bg-gray-200 rounded-full h-2.5">
  199. <div class="bg-green-500 h-2.5 rounded-full" style="width: 60%"></div>
  200. </div>
  201. </div>
  202. </div>
  203. </div>
  204. </div>
  205. <script>
  206. // 设置当前日期
  207. const now = new Date();
  208. const options = { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' };
  209. document.getElementById('current-date').textContent = now.toLocaleDateString('zh-CN', options);
  210. // 作物分布饼图
  211. const cropDistributionChart = echarts.init(document.getElementById('cropDistribution'));
  212. cropDistributionChart.setOption({
  213. tooltip: {
  214. trigger: 'item',
  215. formatter: '{a} <br/>{b}: {c} ({d}%)'
  216. },
  217. legend: {
  218. orient: 'vertical',
  219. right: 10,
  220. top: 'center',
  221. data: ['水稻', '小麦', '玉米', '蔬菜', '果树', '其他']
  222. },
  223. series: [
  224. {
  225. name: '作物分布',
  226. type: 'pie',
  227. radius: ['40%', '70%'],
  228. avoidLabelOverlap: false,
  229. itemStyle: {
  230. borderRadius: 10,
  231. borderColor: '#fff',
  232. borderWidth: 2
  233. },
  234. label: {
  235. show: false,
  236. position: 'center'
  237. },
  238. emphasis: {
  239. label: {
  240. show: true,
  241. fontSize: '18',
  242. fontWeight: 'bold'
  243. }
  244. },
  245. labelLine: {
  246. show: false
  247. },
  248. data: [
  249. { value: 1048, name: '水稻' },
  250. { value: 735, name: '小麦' },
  251. { value: 580, name: '玉米' },
  252. { value: 484, name: '蔬菜' },
  253. { value: 300, name: '果树' },
  254. { value: 200, name: '其他' }
  255. ],
  256. color: ['#4CAF50', '#8BC34A', '#CDDC39', '#FFC107', '#FF9800', '#FF5722']
  257. }
  258. ]
  259. });
  260. // 月度产量趋势
  261. const yieldTrendChart = echarts.init(document.getElementById('yieldTrend'));
  262. yieldTrendChart.setOption({
  263. tooltip: {
  264. trigger: 'axis'
  265. },
  266. legend: {
  267. data: ['去年产量', '今年产量']
  268. },
  269. grid: {
  270. left: '3%',
  271. right: '4%',
  272. bottom: '3%',
  273. containLabel: true
  274. },
  275. xAxis: {
  276. type: 'category',
  277. boundaryGap: false,
  278. data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
  279. },
  280. yAxis: {
  281. type: 'value'
  282. },
  283. series: [
  284. {
  285. name: '去年产量',
  286. type: 'line',
  287. stack: 'Total',
  288. data: [120, 132, 101, 134, 90, 230, 210, 182, 191, 234, 290, 330],
  289. smooth: true,
  290. lineStyle: {
  291. width: 0
  292. },
  293. showSymbol: false,
  294. areaStyle: {
  295. opacity: 0.8,
  296. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  297. {
  298. offset: 0,
  299. color: 'rgba(128, 255, 165, 0.7)'
  300. },
  301. {
  302. offset: 1,
  303. color: 'rgba(1, 191, 236, 0.1)'
  304. }
  305. ])
  306. },
  307. emphasis: {
  308. focus: 'series'
  309. }
  310. },
  311. {
  312. name: '今年产量',
  313. type: 'line',
  314. stack: 'Total',
  315. data: [150, 232, 201, 154, 190, 330, 410, 332, 301, 334, 390, 330],
  316. smooth: true,
  317. lineStyle: {
  318. width: 0
  319. },
  320. showSymbol: false,
  321. areaStyle: {
  322. opacity: 0.8,
  323. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  324. {
  325. offset: 0,
  326. color: 'rgba(0, 221, 255, 0.7)'
  327. },
  328. {
  329. offset: 1,
  330. color: 'rgba(77, 119, 255, 0.1)'
  331. }
  332. ])
  333. },
  334. emphasis: {
  335. focus: 'series'
  336. }
  337. }
  338. ]
  339. });
  340. // 响应式调整图表大小
  341. window.addEventListener('resize', function() {
  342. cropDistributionChart.resize();
  343. yieldTrendChart.resize();
  344. });
  345. </script>
  346. </body>
  347. </html>