8.8 KiB
气象数据平台
基于 Spring Boot 3.5 与 Vue 3 的全栈气象数据管理与分析平台。支持多数据源环境,提供实时文件监控、统计分析与基于角色的访问控制。
开发者文档:CLAUDE.md | 模块文档:system-admin | system-common | system-dynamic-datasource | weather-data-ui
English version: README.md
项目结构
weather-data/
├── system-common/ 公共模块(基础类、Redis、校验、工具类)
├── system-dynamic-datasource/ 多数据源支持(AbstractRoutingDataSource)
├── system-admin/ 主应用(REST API、安全、定时任务、文件扫描)
└── weather-data-ui/ Vue 3 前端(Element Plus、ECharts、Pinia)
模块关系
system-common <-- 被所有后端模块依赖
system-dynamic-datasource <-- 被 system-admin 依赖
system-admin <-- 可运行的 Spring Boot 应用,依赖上述两个模块
weather-data-ui <-- 独立前端,通过 REST API 与 system-admin 通信
system-common 提供基础类层次(BaseEntity、CrudService、CrudServiceImpl)、Redis 工具、校验框架、XSS 防护及通用工具类。所有后端模块均依赖此模块。
system-dynamic-datasource 提供 @DataSource 注解与 DynamicDataSource(继承 AbstractRoutingDataSource),用于运行时切换多数据源。当 system-admin 需要查询不同数据库时使用。
system-admin 是主应用入口(AdminApplication.java),所有业务逻辑按 domain 组织在 modules/ 下:
| 业务域 | 包路径 | 功能说明 |
|---|---|---|
| 逐日气象数据 | modules/weather/dailydata/ | Excel 异步双遍扫描批量导入、CRUD、Redis 缓存统计汇总 |
| 气象站点 | modules/weather/station/ | 站点注册,关联部门实现数据权限隔离 |
| 文件扫描 | modules/weather/filescan/ | WatchService 目录监控,并行文件扫描,MD5 去重,气象资料自动入库 |
| 区域管理 | modules/region/ | 行政区域树(省/市/县),CSV 数据加载 |
| 系统管理 | modules/sys/ | 用户、角色、菜单、部门、字典、参数 |
| 通知消息 | modules/sys/alert/ | SSE 实时推送,Spring 事件驱动广播,外部告警源轮询采集 |
| 安全认证 | modules/security/ | Shiro + Token 认证,OAuth2 过滤器,BCrypt 密码加密,登录状态持久化 |
| 定时任务 | modules/job/ | Quartz 动态任务管理,在线创建、启停、修改 Cron 表达式 |
| 审计日志 | modules/log/ | 操作日志、登录日志、异常日志 |
| 云存储 | modules/oss/ | 阿里云 OSS / 七牛云 / 腾讯云 COS 文件存储 |
weather-data-ui 是 Vue 3 单页应用,通过 REST API 与 system-admin 通信。特性包括:动态路由(登录时从服务端菜单加载)、标签页导航、ECharts 图表可视化、SSE 实时通知滚动、客户端 Excel/PDF 导出。
技术栈
| 层级 | 技术 |
|---|---|
| 后端框架 | Spring Boot 3.5.11, MyBatis-Plus 3.5.8, Apache Shiro 1.12 |
| 数据库 | MySQL 8.0(同时支持 Oracle、SQL Server、PostgreSQL、达梦) |
| 连接池 | Druid 1.2 |
| 缓存 | Redis 7(Lettuce 客户端,通过 project-options.redis.open 控制开关) |
| 定时任务 | Quartz 2.3 |
| 接口文档 | Knife4j 4.5 (Swagger) |
| Excel 处理 | EasyExcel 3.2 |
| 前端 | Vue 3.5, TypeScript 5.7, Vite 5.4, Element Plus 2.10, Pinia 2.3, ECharts 5 |
环境要求:JDK 17+、Maven 3.6+、Node.js 18+、MySQL 8.0+
快速启动(本地开发)
1. 初始化数据库
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS weather_data_system DEFAULT CHARSET utf8mb4"
mysql -u root -p weather_data_system < system-admin/db/weather_data_system.sql
mysql -u root -p weather_data_system < system-admin/db/init_system_params.sql
数据库脚本:system-admin/db/weather_data_system.sql | system-admin/db/init_system_params.sql
2. 配置数据源
编辑 system-admin/src/main/resources/application-dev.yml,修改 MySQL 和 Redis 连接信息:
spring:
datasource:
druid:
url: jdbc:mysql://localhost:3306/weather_data_system?...
username: root
password: 你的密码
data:
redis:
host: 127.0.0.1
port: 6379
password:
3. 启动后端
# 完整构建
mvn clean install -DskipTests
# 在 IDE 中运行 AdminApplication.java
# 或命令行启动:
cd system-admin && mvn spring-boot:run -Dspring-boot.run.profiles=dev
管理后台:http://localhost:8080/system-admin
接口文档:http://localhost:8080/system-admin/doc.html
默认账号:admin / admin
4. 启动前端
cd weather-data-ui
npm install
npm run dev
前端开发服务器:http://localhost:8001
如需修改后端地址,编辑 weather-data-ui/.env.development 中的 VITE_APP_API。
部署
- 构建后端:
mvn clean package -DskipTests -f system-admin - 构建前端:
cd weather-data-ui && npm run build - 将
system-admin/target/system-admin.jar和weather-data-ui/dist/部署到服务器 - 配置
application-prod.yml中的生产环境数据库和 Redis 连接信息 - 启动后端:
java -jar system-admin.jar --spring.profiles.active=prod
核心功能
- 气象数据导入:Excel 异步双遍扫描批量导入,实时进度可查,多行 INSERT 优化,自动站点-部门映射。入口:WeatherDataImportManager
- 统计汇总:历年同月同日数据汇总,Redis 缓存加速查询,缓存未命中时自动降级至数据库。缓存任务:WeatherSummarizeCacheTask
- 文件监控:基于 WatchService 自动监控资料目录,启动时并行扫描存量文件,MD5 去重,文件生命周期管理(接收 -> 展示 -> 归档)。服务:FileWatchServiceManager
- 实时通知:基于 SSE 的服务端推送,Spring 事件驱动广播(创建/撤回/删除),支持外部告警源轮询采集。服务:SseAlertService
- 数据权限:基于 MyBatis-Plus 拦截器的部门级行级安全,通过
@DataFilter注解启用,SQL WHERE 子句注入。拦截器:DataFilterInterceptor - 动态数据源:运行时通过
@DataSource注解切换数据源,ThreadLocal 上下文传递。实现:DynamicDataSource - 定时任务:Quartz 动态任务管理,支持在线创建、启停、暂停、修改 Cron 表达式,执行历史可查。配置:ScheduleConfig
- 云存储:支持阿里云 OSS、七牛云、腾讯云 COS 文件上传与管理,统一上传接口。工厂:OSSFactory