This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
This is RuoYi v3.9.0 (若依), a Chinese Spring Boot + Vue admin framework customized for IoT/Energy Storage Management (储能运营平台). It extends the standard RuoYi RBAC system with IoT device management, time-series data ingestion, MQTT messaging, and vehicle/equipment tracking.
This is a Maven multi-module project. All commands should be run from the repository root.
# Compile all modules
mvn clean compile
# Package into executable JAR (skips tests — there are no tests in this project)
mvn clean package -Dmaven.test.skip=true
# Run the application (after packaging)
cd ruoyi-admin/target
java -jar ruoyi-admin.jar
# Or use the provided script
./ry.sh start # start / stop / restart / status
The application starts on port 8887. The executable JAR is ruoyi-admin/target/ruoyi-admin.jar.
ruoyi-admin → Web layer: REST controllers, Swagger config, application.yml entrypoint
ruoyi-framework → Infrastructure: Spring Security config, JWT filter, Druid datasource,
Redis config, MyBatis config, AOP aspects (logging, rate limit, data scope)
ruoyi-system → Business layer: domain models, mappers (MyBatis), services,
service implementations — this is where custom IoT logic lives
ruoyi-common → Shared utilities: constants, enums, exception types, utils (StringUtils,
SecurityUtils, DateUtils, ServletUtils, etc.)
ruoyi-quartz → Scheduled job engine (standard RuoYi)
ruoyi-generator → Code generation templates (standard RuoYi)
Dependency flow: admin → framework → system → common. quartz and generator are optional add-ons.
data): RuoYi system tables (users, roles, menus, logs, custom business tables)cnc): Secondary data — configured in application-druid.yml47.104.204.180:3306@DataSource annotationTDengineService (ruoyi-system/.../service/TDengineService.java)jdbc:TAOS://localhost:6030/CREATE STABLE ... (ts TIMESTAMP, surfacename VARCHAR(64)) TAGS (location BINARY(64))stableColumnCache) to avoid repeated DESCRIBE callslocalhost:6379DSB:active:devices — Set of active IoT device Redis keysDSB:<controllerId>:<metricName> — Hash storing device telemetry fieldsworkorder:coordinate:<controllerId> — Hash storing vehicle GPS (latitude, longitude)<controllerId>:<topicName> / <controllerId>_cmd:<topicName> / <controllerId>_fault:<topicName> — MQTT topic metadataStandard RuoYi provides users, roles, menus, depts, posts, dicts, config, notices, operlog, logininfor. This project adds:
| Domain | Purpose | Key Files |
|---|---|---|
| SysDevice | IoT device telemetry key-value storage | domain/SysDevice.java, mapper/SysDeviceMapper.java, service/SysDeviceService.java |
| SysDeviceControl | Device configuration / metric whitelist | domain/SysDeviceControl.java, service/SysDeviceControlService.java |
| SysDeviceVo | Aggregated device view for frontend | domain/vo/SysDeviceVo.java, service/SysDeviceVoService.java |
| SysCar | Vehicle/equipment with GPS tracking | domain/SysCar.java, service/SysCarService.java |
| SysAlarm | Alarm events from devices | domain/SysAlarm.java, service/SysAlarmService.java |
| SysFault | Fault records | domain/SysFault.java, service/SysFaultService.java |
| SysWorkorder | Work orders / service tickets | domain/SysWorkorder.java, service/SysWorkorderService.java |
| SysCompany | Partner company management | domain/SysCompany.java, service/SysCompanyService.java |
| SysIndicators | Daily business KPIs (order count, profit) | domain/SysIndicators.java, service/SysIndicatorsService.java |
| SysController | MQTT topic registry per controller | domain/SysController.java, service/SysControllerService.java |
| Sysrealtime | Real-time device data sync from Redis → MySQL | domain/Sysrealtime.java, service/SysrealtimeService.java |
| ControllerData / topics | DTOs for MQTT JSON payload parsing | domain/ControllerData.java, domain/topics.java |
| MqttClientWrapper | Wrapper around Eclipse Paho MQTT client | domain/MqttClientWrapper.java |
MQTT Broker (47.104.204.180:1883)
↓ subscribes to "+/generics"
TdengineController2 / TdegnineController3 (MQTT listeners)
↓ parse JSON → ControllerData → topics
├─→ Redis (DSB:active:devices, DSB:<id>:<metric> hashes)
├─→ MySQL (sys_controller table — topic registry)
└─→ TDengine (time-series telemetry)
SysCarController (scheduled tasks, every 30s)
↓ reads Redis DSB:* keys
├─→ syncs to sysrealtime (MySQL)
├─→ updates vehicle GPS in sys_car (MySQL)
├─→ updates sys_indicators KPIs (MySQL)
└─→ triggers external webhook (https://esos-iot.com:9443/syscar/trigger)
There are 4 @Scheduled(fixedRate = 30000) tasks in SysCarController:
updatesyscar() — sync vehicle GPS from Redis to MySQL, trigger webhook on changeinsertdevice() — sync device config from Redis to sys_device_vosyncRedisToMySQL() — sync telemetry from Redis to sysrealtimeinsertindicators() — aggregate daily KPIs per company into sys_indicatorsruoyi-admin/src/main/resources/application.yml — Main config (port 8887, Redis, MyBatis, PageHelper, Swagger, token settings)ruoyi-admin/src/main/resources/application-druid.yml — Database connection (master/slave MySQL, Druid pool)ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml — MyBatis global settingsruoyi-admin/src/main/resources/logback.xml — Logging configAuthorization)ruoyi-framework/.../config/SecurityConfig.javaJwtAuthenticationTokenFilter.java/dev-api path mapping/system/*, /monitor/*, /tool/*All controllers return AjaxResult (from ruoyi-common), which wraps:
{
"code": 200, // HttpStatus constant
"msg": "操作成功", // message
"data": { ... } // payload
}
Page queries use TableDataInfo which wraps:
{
"code": 200,
"msg": "查询成功",
"rows": [ ... ], // list data
"total": 100 // total count
}
@Autowired on fields), not constructor injection.src/main/resources/mapper/ruoyi-system/.../mapper/DynamicSqlProvider.java provides programmatic SQL for some queriesISysXxxService interface + SysXxxServiceImpl implementation. Custom services (added by this project) often omit the I prefix and use concrete classes directly.TDengineService.java — be careful with SQL injection if user input reaches those paths.TdengineController2.java and TdegnineController3.java.application-druid.yml.https://maven.aliyun.com/repository/public) configured in root pom.xml.