Files
dms/client/src/components/Weather.jsx
T

55 lines
1.7 KiB
React
Raw Normal View History

2026-08-10 22:56:38 +08:00
import React, { useState, useEffect } from 'react'
import { Tag, Spin, Tooltip } from 'antd'
import { CloudOutlined, SunOutlined, CloudRain, ThunderboltOutlined } from '@ant-design/icons'
import axios from 'axios'
function Weather() {
const [weather, setWeather] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
fetchWeather()
}, [])
const fetchWeather = async () => {
try {
const res = await axios.get('/api/weather/current?city=beijing')
if (res.data.success) {
setWeather(res.data.data)
}
} catch (err) {
console.error('获取天气失败:', err)
} finally {
setLoading(false)
}
}
const getWeatherIcon = (code) => {
if (code === 0) return <SunOutlined style={{ color: '#faad14' }} />
if ([95, 96, 99].includes(code)) return <ThunderboltOutlined style={{ color: '#722ed1' }} />
if ([61, 63, 65, 80, 81, 82].includes(code)) return <CloudRainOutlined style={{ color: '#1890ff' }} />
return <CloudOutlined style={{ color: '#8c8c8c' }} />
}
if (loading) {
return <Spin size="small" />
}
if (!weather) {
return null
}
return (
<Tooltip title={`${weather.city} · 湿度 ${weather.current.humidity}% · 风速 ${weather.current.windSpeed}km/h`}>
<Tag icon={getWeatherIcon(weather.current.code)} color="default" style={{ display: 'flex', alignItems: 'center', gap: 4, padding: '4px 8px', fontSize: 14 }}>
<span>{weather.city}</span>
<span style={{ fontWeight: 600 }}>{weather.current.temp}°C</span>
<span>{weather.current.weather}</span>
<span style={{ color: '#999', fontSize: 12 }}>H:{weather.daily.maxTemp}° L:{weather.daily.minTemp}°</span>
</Tag>
</Tooltip>
)
}
export default Weather