1. 项目背景与技术选型
天气预报系统作为典型的Web应用,采用SpringBoot+Vue的前后端分离架构具有显著优势。SpringBoot的自动配置特性让我们能快速搭建RESTful API服务,而Vue的响应式数据绑定则完美适配实时天气数据的展示需求。
技术栈选择依据:
- 后端:SpringBoot 2.7 + MyBatis Plus
- 前端:Vue 3 + Element Plus
- 数据库:MySQL 8.0
- 构建工具:Maven + Webpack
注意:实际开发中建议锁定具体版本号,避免因依赖版本冲突导致构建失败。例如SpringBoot建议使用2.7.18稳定版而非3.x系列,后者对JDK版本要求更高。
2. 系统架构设计
2.1 整体架构图
采用经典的三层架构:
code复制前端层(Vue)
↑↓ HTTP/HTTPS
业务逻辑层(SpringBoot)
↑↓ JDBC
数据持久层(MySQL)
2.2 模块划分
- 数据采集模块:对接第三方天气API
- 数据处理模块:数据清洗与格式化
- 数据存储模块:MySQL持久化
- 数据展示模块:Vue前端渲染
- 用户管理模块:基础RBAC实现
3. 核心功能实现
3.1 天气数据获取
推荐使用心知天气或和风天气的免费API:
java复制// SpringBoot中封装API调用示例
@RestController
@RequestMapping("/api/weather")
public class WeatherController {
@Value("${weather.api.key}")
private String apiKey;
@GetMapping("/current")
public ResponseEntity<Object> getCurrentWeather(
@RequestParam String location) {
String url = "https://api.seniverse.com/v3/weather/now.json" +
"?key=" + apiKey + "&location=" + location;
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForEntity(url, Object.class);
}
}
3.2 前端数据展示
Vue组件关键代码:
vue复制<template>
<div class="weather-card">
<el-card>
<div v-if="loading">加载中...</div>
<div v-else>
<h3>{{ weatherData.location.name }}</h3>
<p>温度: {{ weatherData.now.temperature }}°C</p>
<p>天气: {{ weatherData.now.text }}</p>
</div>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
loading: true,
weatherData: {}
}
},
async mounted() {
try {
const res = await axios.get('/api/weather/current', {
params: { location: 'beijing' }
});
this.weatherData = res.data;
} finally {
this.loading = false;
}
}
}
</script>
4. 关键技术难点解决方案
4.1 跨域问题处理
SpringBoot配置CORS:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST")
.maxAge(3600);
}
}
4.2 数据缓存策略
采用Redis缓存天气数据,减少API调用:
yaml复制# application.yml配置
spring:
redis:
host: localhost
port: 6379
java复制@Service
public class WeatherService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public Object getWeatherWithCache(String location) {
String cacheKey = "weather:" + location;
Object cached = redisTemplate.opsForValue().get(cacheKey);
if (cached != null) {
return cached;
}
// 调用真实API
Object freshData = fetchFromAPI(location);
redisTemplate.opsForValue().set(
cacheKey,
freshData,
30, TimeUnit.MINUTES); // 缓存30分钟
return freshData;
}
}
5. 开发环境搭建指南
5.1 后端环境
- JDK 1.8+ (推荐Amazon Corretto 11)
- IntelliJ IDEA (社区版即可)
- MySQL 8.0+ (注意配置字符集为utf8mb4)
5.2 前端环境
- Node.js 16+
- Vue CLI 5
- 推荐VS Code + Volar插件
避坑提示:Windows环境下务必确认JAVA_HOME环境变量配置正确,这是大多数SpringBoot启动失败的根源。
6. 项目部署方案
6.1 后端打包部署
bash复制# 打包
mvn clean package -DskipTests
# 运行
java -jar target/weather-app-0.0.1-SNAPSHOT.jar
6.2 前端部署优化
- 生产环境构建:
bash复制npm run build
- 配置Nginx反向代理:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
root /path/to/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
}
}
7. 扩展功能建议
- 历史数据统计:使用ECharts实现天气趋势可视化
- 多城市管理:实现用户自定义关注城市列表
- 预警通知:集成WebSocket实现极端天气推送
- 移动端适配:通过Vant UI实现响应式布局
8. 性能优化要点
- 前端:
- 启用gzip压缩
- 配置合理的HTTP缓存头
- 使用Vue的异步组件按需加载
- 后端:
- 启用SpringBoot Actuator监控端点
- 配置合理的连接池参数
- 对频繁访问的接口添加二级缓存
9. 常见问题排查
9.1 前端跨域问题
症状:浏览器控制台出现CORS错误
解决方案:
- 确认后端已正确配置CORS
- 检查前端请求URL是否完整
- 开发环境可配置webpack代理
9.2 天气API返回异常
症状:接口返回403或数据为空
排查步骤:
- 检查API密钥是否有效
- 验证请求参数格式
- 查看API提供商的调用限额
9.3 数据库连接失败
典型错误:Communications link failure
解决方法:
- 确认MySQL服务已启动
- 检查application.yml中的连接配置
- 验证数据库用户权限
10. 项目演进方向
- 微服务化改造:将天气服务拆分为独立微服务
- 容器化部署:采用Docker+ Kubernetes
- 大数据分析:集成Spark进行历史天气数据分析
- 机器学习:实现简单的天气预测模型
这个天气预报系统虽然功能简单,但完整涵盖了现代Web开发的各个环节。我在实际开发中发现,合理设置缓存策略能显著提升系统响应速度,特别是在免费API有调用频率限制的情况下。建议初学者重点关注前后端交互的数据格式约定,这是联调阶段最容易出现问题的地方。
