From 4c24dc3cb0ce764f733fda16d99cf85ed2e9e169 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 00:02:17 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../~$开发计划第一稿.docx | Bin 0 -> 162 bytes .../campus/water/ CampusWaterApplication.java | 0 .../campus/water/ CampusWaterApplication.java | 23 +++ .../com/campus/water/config/MqttConfig.java | 80 ++++++++ .../water/config/MqttInboundConfig.java | 35 ++++ .../com/campus/water/config/先读我.md | 0 .../campus/water/controller/app/先读我.md | 0 .../water/controller/common/先读我.md | 0 .../campus/water/controller/web/先读我.md | 0 .../java}/com/campus/water/entity/Admin.java | 0 .../java}/com/campus/water/entity/Alert.java | 0 .../java}/com/campus/water/entity/Area.java | 0 .../java}/com/campus/water/entity/Device.java | 0 .../water/entity/DeviceTerminalMapping.java | 0 .../water/entity/DrinkRecommendation.java | 0 .../com/campus/water/entity/DrinkRecord.java | 0 .../campus/water/entity/InspectionRecord.java | 0 .../campus/water/entity/MaintenancePlan.java | 0 .../com/campus/water/entity/MessagePush.java | 0 .../com/campus/water/entity/RepairerAuth.java | 0 .../com/campus/water/entity/Repairman.java | 0 .../water/entity/TerminalUsageStats.java | 0 .../java}/com/campus/water/entity/User.java | 0 .../water/entity/WaterMakerRealtimeData.java | 0 .../water/entity/WaterQualityHistory.java | 0 .../water/entity/WaterSupplyRealtimeData.java | 0 .../com/campus/water/entity/WorkOrder.java | 0 .../com/campus/water/entity/先读我.md | 0 .../campus/water/mapper/AdminRepository.java | 0 .../campus/water/mapper/AlertRepository.java | 0 .../campus/water/mapper/AreaRepository.java | 0 .../campus/water/mapper/DeviceRepository.java | 0 .../DeviceTerminalMappingRepository.java | 0 .../mapper/DrinkRecommendationRepository.java | 0 .../water/mapper/DrinkRecordRepository.java | 0 .../mapper/InspectionRecordRepository.java | 0 .../mapper/MaintenancePlanRepository.java | 0 .../water/mapper/MessagePushRepository.java | 0 .../water/mapper/RepairerAuthRepository.java | 0 .../water/mapper/RepairmanRepository.java | 0 .../mapper/TerminalUsageStatsRepository.java | 0 .../campus/water/mapper/UserRepository.java | 0 .../WaterMakerRealtimeDataRepository.java | 0 .../mapper/WaterQualityHistoryRepository.java | 0 .../WaterSupplyRealtimeDataRepository.java | 0 .../water/mapper/WorkOrderRepository.java | 0 .../com/campus/water/mapper/先读我.md | 0 .../water/model/WaterMakerSensorData.java | 23 +++ .../water/model/WaterSupplySensorData.java | 20 ++ .../com/campus/water/security/先读我.md | 0 .../water/service/MqttSensorReceiver.java | 183 ++++++++++++++++++ .../water/service/MqttSensorSender.java | 133 +++++++++++++ .../com/campus/water/service/先读我.md | 0 .../water/task/SensorSimulationTask.java | 68 +++++++ .../java}/com/campus/water/util/先读我.md | 0 .../java}/com/campus/water/view/先读我.md | 0 src/main/resources/application.yml | 49 +++++ 57 files changed, 614 insertions(+) create mode 100644 doc/project/03-计划文档/~$开发计划第一稿.docx delete mode 100644 src/com/campus/water/ CampusWaterApplication.java create mode 100644 src/main/java/com/campus/water/ CampusWaterApplication.java create mode 100644 src/main/java/com/campus/water/config/MqttConfig.java create mode 100644 src/main/java/com/campus/water/config/MqttInboundConfig.java rename src/{ => main/java}/com/campus/water/config/先读我.md (100%) rename src/{ => main/java}/com/campus/water/controller/app/先读我.md (100%) rename src/{ => main/java}/com/campus/water/controller/common/先读我.md (100%) rename src/{ => main/java}/com/campus/water/controller/web/先读我.md (100%) rename src/{ => main/java}/com/campus/water/entity/Admin.java (100%) rename src/{ => main/java}/com/campus/water/entity/Alert.java (100%) rename src/{ => main/java}/com/campus/water/entity/Area.java (100%) rename src/{ => main/java}/com/campus/water/entity/Device.java (100%) rename src/{ => main/java}/com/campus/water/entity/DeviceTerminalMapping.java (100%) rename src/{ => main/java}/com/campus/water/entity/DrinkRecommendation.java (100%) rename src/{ => main/java}/com/campus/water/entity/DrinkRecord.java (100%) rename src/{ => main/java}/com/campus/water/entity/InspectionRecord.java (100%) rename src/{ => main/java}/com/campus/water/entity/MaintenancePlan.java (100%) rename src/{ => main/java}/com/campus/water/entity/MessagePush.java (100%) rename src/{ => main/java}/com/campus/water/entity/RepairerAuth.java (100%) rename src/{ => main/java}/com/campus/water/entity/Repairman.java (100%) rename src/{ => main/java}/com/campus/water/entity/TerminalUsageStats.java (100%) rename src/{ => main/java}/com/campus/water/entity/User.java (100%) rename src/{ => main/java}/com/campus/water/entity/WaterMakerRealtimeData.java (100%) rename src/{ => main/java}/com/campus/water/entity/WaterQualityHistory.java (100%) rename src/{ => main/java}/com/campus/water/entity/WaterSupplyRealtimeData.java (100%) rename src/{ => main/java}/com/campus/water/entity/WorkOrder.java (100%) rename src/{ => main/java}/com/campus/water/entity/先读我.md (100%) rename src/{ => main/java}/com/campus/water/mapper/AdminRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/AlertRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/AreaRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/DeviceRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/DeviceTerminalMappingRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/DrinkRecommendationRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/DrinkRecordRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/InspectionRecordRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/MaintenancePlanRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/MessagePushRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/RepairerAuthRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/RepairmanRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/TerminalUsageStatsRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/UserRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/WaterQualityHistoryRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/WorkOrderRepository.java (100%) rename src/{ => main/java}/com/campus/water/mapper/先读我.md (100%) create mode 100644 src/main/java/com/campus/water/model/WaterMakerSensorData.java create mode 100644 src/main/java/com/campus/water/model/WaterSupplySensorData.java rename src/{ => main/java}/com/campus/water/security/先读我.md (100%) create mode 100644 src/main/java/com/campus/water/service/MqttSensorReceiver.java create mode 100644 src/main/java/com/campus/water/service/MqttSensorSender.java rename src/{ => main/java}/com/campus/water/service/先读我.md (100%) create mode 100644 src/main/java/com/campus/water/task/SensorSimulationTask.java rename src/{ => main/java}/com/campus/water/util/先读我.md (100%) rename src/{ => main/java}/com/campus/water/view/先读我.md (100%) create mode 100644 src/main/resources/application.yml diff --git a/doc/project/03-计划文档/~$开发计划第一稿.docx b/doc/project/03-计划文档/~$开发计划第一稿.docx new file mode 100644 index 0000000000000000000000000000000000000000..fcc4ec6a7dab78fd07b9f0a58a68506dff7853d0 GIT binary patch literal 162 gcmZQIvM@6=W*`x;G8i#fFqknIGLWp5M4K2G01p}h6951J literal 0 HcmV?d00001 diff --git a/src/com/campus/water/ CampusWaterApplication.java b/src/com/campus/water/ CampusWaterApplication.java deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/campus/water/ CampusWaterApplication.java b/src/main/java/com/campus/water/ CampusWaterApplication.java new file mode 100644 index 0000000..375cd42 --- /dev/null +++ b/src/main/java/com/campus/water/ CampusWaterApplication.java @@ -0,0 +1,23 @@ +package com.campus.water; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.integration.config.EnableIntegration; +import org.springframework.integration.config.EnableIntegrationManagement; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * Spring Boot 主启动类 + * 核心注解:开启自动配置、定时任务、Spring Integration + */ +@SpringBootApplication(scanBasePackages = "com.campus.water") // 扫描所有业务组件 +@EnableScheduling // 开启定时任务(支持@Scheduled) +@EnableIntegration // 开启Spring Integration(支持MQTT集成) +@EnableIntegrationManagement // 开启Integration管理(监控消息流转) +public class CampusWaterApplication { + public static void main(String[] args) { + SpringApplication.run(CampusWaterApplication.class, args); + System.out.println("=== 校园直饮矿化水系统(Spring Boot版)启动成功 ==="); + System.out.println("=== MQTT传感器模拟、数据接收、持久化功能已启用 ==="); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/config/MqttConfig.java b/src/main/java/com/campus/water/config/MqttConfig.java new file mode 100644 index 0000000..cac67a8 --- /dev/null +++ b/src/main/java/com/campus/water/config/MqttConfig.java @@ -0,0 +1,80 @@ +package com.campus.water.config; + +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory; +import org.springframework.integration.mqtt.core.MqttPahoClientFactory; +import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; +import org.springframework.messaging.MessageChannel; + +@Configuration +public class MqttConfig { + // MQTT 基础配置(可迁移到 application.yml 中,用 @ConfigurationProperties 绑定) + public static final String BROKER = "tcp://b17be106.ala.cn-hangzhou.emqxsl.cn:8883"; + public static final String USERNAME = "admin"; + public static final String PASSWORD = "12345678"; + public static final int QOS = 1; // 消息质量等级(1=确保送达,不重复) + public static final int CONNECTION_TIMEOUT = 30000; // 连接超时(毫秒) + public static final int KEEP_ALIVE_INTERVAL = 60; // 心跳间隔(秒) + + // MQTT 主题定义(按设备类型+功能分层) + public static final String TOPIC_WATER_MAKER_STATE = "/device/state/water_maker/"; + public static final String TOPIC_WATER_MAKER_WARN = "/device/warn/water_maker/"; + public static final String TOPIC_WATER_SUPPLIER_STATE = "/device/state/water_supply/"; + public static final String TOPIC_WATER_SUPPLIER_WARN = "/device/warn/water_supply/"; + + /** + * MQTT 客户端工厂(Spring 管理,统一创建客户端) + */ + @Bean + public MqttPahoClientFactory mqttClientFactory() { + DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory(); + MqttConnectOptions options = new MqttConnectOptions(); + + // 配置连接参数 + options.setServerURIs(new String[]{BROKER}); + options.setUserName(USERNAME); + options.setPassword(PASSWORD.toCharArray()); + options.setConnectionTimeout(CONNECTION_TIMEOUT / 1000); // 转换为秒 + options.setKeepAliveInterval(KEEP_ALIVE_INTERVAL); + options.setAutomaticReconnect(true); // 断线自动重连 + options.setCleanSession(true); // 断开后清除会话 + + factory.setConnectionOptions(options); + return factory; + } + + /** + * 发送消息通道(DirectChannel:同步发送,确保消息顺序) + */ + @Bean + public MessageChannel mqttOutboundChannel() { + return new DirectChannel(); + } + + /** + * MQTT 消息发送处理器(封装发送逻辑) + */ + @Bean + public MqttPahoMessageHandler mqttOutbound() { + // 客户端ID:前缀+时间戳,避免重复 + String clientId = "sensor-sender-" + System.currentTimeMillis(); + MqttPahoMessageHandler handler = new MqttPahoMessageHandler(clientId, mqttClientFactory()); + + handler.setAsync(true); // 异步发送(不阻塞主线程) + handler.setDefaultQos(QOS); // 默认QOS等级 + handler.setDefaultTopic(TOPIC_WATER_MAKER_STATE); // 默认主题(可在发送时覆盖) + + return handler; + } + + /** + * 接收消息通道(用于接收端转发消息) + */ + @Bean + public MessageChannel mqttInputChannel() { + return new DirectChannel(); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/config/MqttInboundConfig.java b/src/main/java/com/campus/water/config/MqttInboundConfig.java new file mode 100644 index 0000000..62b7381 --- /dev/null +++ b/src/main/java/com/campus/water/config/MqttInboundConfig.java @@ -0,0 +1,35 @@ +package com.campus.water.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter; + +@Configuration +public class MqttInboundConfig { + + /** + * MQTT 接收适配器(监听MQTT主题,接收消息并转发到通道) + */ + @Bean + public MqttPahoMessageDrivenChannelAdapter mqttInbound(MqttConfig mqttConfig) { + // 接收端客户端ID(与发送端区分) + String clientId = "sensor-receiver-" + System.currentTimeMillis(); + + // 创建适配器:指定客户端ID、工厂、默认订阅主题(可后续动态添加) + MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter( + clientId, + mqttConfig.mqttClientFactory() + ); + + // 配置消息转换器(默认UTF-8编码,支持JSON格式) + adapter.setConverter(new DefaultPahoMessageConverter()); + adapter.setQos(mqttConfig.QOS); // 订阅QOS等级与发送端一致 + adapter.setOutputChannel(mqttConfig.mqttInputChannel()); // 消息转发到接收通道 + + // 开启异常重试(避免网络波动导致消息丢失) + adapter.setRecoveryInterval(5000); // 重试间隔5秒 + + return adapter; + } +} \ No newline at end of file diff --git a/src/com/campus/water/config/先读我.md b/src/main/java/com/campus/water/config/先读我.md similarity index 100% rename from src/com/campus/water/config/先读我.md rename to src/main/java/com/campus/water/config/先读我.md diff --git a/src/com/campus/water/controller/app/先读我.md b/src/main/java/com/campus/water/controller/app/先读我.md similarity index 100% rename from src/com/campus/water/controller/app/先读我.md rename to src/main/java/com/campus/water/controller/app/先读我.md diff --git a/src/com/campus/water/controller/common/先读我.md b/src/main/java/com/campus/water/controller/common/先读我.md similarity index 100% rename from src/com/campus/water/controller/common/先读我.md rename to src/main/java/com/campus/water/controller/common/先读我.md diff --git a/src/com/campus/water/controller/web/先读我.md b/src/main/java/com/campus/water/controller/web/先读我.md similarity index 100% rename from src/com/campus/water/controller/web/先读我.md rename to src/main/java/com/campus/water/controller/web/先读我.md diff --git a/src/com/campus/water/entity/Admin.java b/src/main/java/com/campus/water/entity/Admin.java similarity index 100% rename from src/com/campus/water/entity/Admin.java rename to src/main/java/com/campus/water/entity/Admin.java diff --git a/src/com/campus/water/entity/Alert.java b/src/main/java/com/campus/water/entity/Alert.java similarity index 100% rename from src/com/campus/water/entity/Alert.java rename to src/main/java/com/campus/water/entity/Alert.java diff --git a/src/com/campus/water/entity/Area.java b/src/main/java/com/campus/water/entity/Area.java similarity index 100% rename from src/com/campus/water/entity/Area.java rename to src/main/java/com/campus/water/entity/Area.java diff --git a/src/com/campus/water/entity/Device.java b/src/main/java/com/campus/water/entity/Device.java similarity index 100% rename from src/com/campus/water/entity/Device.java rename to src/main/java/com/campus/water/entity/Device.java diff --git a/src/com/campus/water/entity/DeviceTerminalMapping.java b/src/main/java/com/campus/water/entity/DeviceTerminalMapping.java similarity index 100% rename from src/com/campus/water/entity/DeviceTerminalMapping.java rename to src/main/java/com/campus/water/entity/DeviceTerminalMapping.java diff --git a/src/com/campus/water/entity/DrinkRecommendation.java b/src/main/java/com/campus/water/entity/DrinkRecommendation.java similarity index 100% rename from src/com/campus/water/entity/DrinkRecommendation.java rename to src/main/java/com/campus/water/entity/DrinkRecommendation.java diff --git a/src/com/campus/water/entity/DrinkRecord.java b/src/main/java/com/campus/water/entity/DrinkRecord.java similarity index 100% rename from src/com/campus/water/entity/DrinkRecord.java rename to src/main/java/com/campus/water/entity/DrinkRecord.java diff --git a/src/com/campus/water/entity/InspectionRecord.java b/src/main/java/com/campus/water/entity/InspectionRecord.java similarity index 100% rename from src/com/campus/water/entity/InspectionRecord.java rename to src/main/java/com/campus/water/entity/InspectionRecord.java diff --git a/src/com/campus/water/entity/MaintenancePlan.java b/src/main/java/com/campus/water/entity/MaintenancePlan.java similarity index 100% rename from src/com/campus/water/entity/MaintenancePlan.java rename to src/main/java/com/campus/water/entity/MaintenancePlan.java diff --git a/src/com/campus/water/entity/MessagePush.java b/src/main/java/com/campus/water/entity/MessagePush.java similarity index 100% rename from src/com/campus/water/entity/MessagePush.java rename to src/main/java/com/campus/water/entity/MessagePush.java diff --git a/src/com/campus/water/entity/RepairerAuth.java b/src/main/java/com/campus/water/entity/RepairerAuth.java similarity index 100% rename from src/com/campus/water/entity/RepairerAuth.java rename to src/main/java/com/campus/water/entity/RepairerAuth.java diff --git a/src/com/campus/water/entity/Repairman.java b/src/main/java/com/campus/water/entity/Repairman.java similarity index 100% rename from src/com/campus/water/entity/Repairman.java rename to src/main/java/com/campus/water/entity/Repairman.java diff --git a/src/com/campus/water/entity/TerminalUsageStats.java b/src/main/java/com/campus/water/entity/TerminalUsageStats.java similarity index 100% rename from src/com/campus/water/entity/TerminalUsageStats.java rename to src/main/java/com/campus/water/entity/TerminalUsageStats.java diff --git a/src/com/campus/water/entity/User.java b/src/main/java/com/campus/water/entity/User.java similarity index 100% rename from src/com/campus/water/entity/User.java rename to src/main/java/com/campus/water/entity/User.java diff --git a/src/com/campus/water/entity/WaterMakerRealtimeData.java b/src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java similarity index 100% rename from src/com/campus/water/entity/WaterMakerRealtimeData.java rename to src/main/java/com/campus/water/entity/WaterMakerRealtimeData.java diff --git a/src/com/campus/water/entity/WaterQualityHistory.java b/src/main/java/com/campus/water/entity/WaterQualityHistory.java similarity index 100% rename from src/com/campus/water/entity/WaterQualityHistory.java rename to src/main/java/com/campus/water/entity/WaterQualityHistory.java diff --git a/src/com/campus/water/entity/WaterSupplyRealtimeData.java b/src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java similarity index 100% rename from src/com/campus/water/entity/WaterSupplyRealtimeData.java rename to src/main/java/com/campus/water/entity/WaterSupplyRealtimeData.java diff --git a/src/com/campus/water/entity/WorkOrder.java b/src/main/java/com/campus/water/entity/WorkOrder.java similarity index 100% rename from src/com/campus/water/entity/WorkOrder.java rename to src/main/java/com/campus/water/entity/WorkOrder.java diff --git a/src/com/campus/water/entity/先读我.md b/src/main/java/com/campus/water/entity/先读我.md similarity index 100% rename from src/com/campus/water/entity/先读我.md rename to src/main/java/com/campus/water/entity/先读我.md diff --git a/src/com/campus/water/mapper/AdminRepository.java b/src/main/java/com/campus/water/mapper/AdminRepository.java similarity index 100% rename from src/com/campus/water/mapper/AdminRepository.java rename to src/main/java/com/campus/water/mapper/AdminRepository.java diff --git a/src/com/campus/water/mapper/AlertRepository.java b/src/main/java/com/campus/water/mapper/AlertRepository.java similarity index 100% rename from src/com/campus/water/mapper/AlertRepository.java rename to src/main/java/com/campus/water/mapper/AlertRepository.java diff --git a/src/com/campus/water/mapper/AreaRepository.java b/src/main/java/com/campus/water/mapper/AreaRepository.java similarity index 100% rename from src/com/campus/water/mapper/AreaRepository.java rename to src/main/java/com/campus/water/mapper/AreaRepository.java diff --git a/src/com/campus/water/mapper/DeviceRepository.java b/src/main/java/com/campus/water/mapper/DeviceRepository.java similarity index 100% rename from src/com/campus/water/mapper/DeviceRepository.java rename to src/main/java/com/campus/water/mapper/DeviceRepository.java diff --git a/src/com/campus/water/mapper/DeviceTerminalMappingRepository.java b/src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java similarity index 100% rename from src/com/campus/water/mapper/DeviceTerminalMappingRepository.java rename to src/main/java/com/campus/water/mapper/DeviceTerminalMappingRepository.java diff --git a/src/com/campus/water/mapper/DrinkRecommendationRepository.java b/src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java similarity index 100% rename from src/com/campus/water/mapper/DrinkRecommendationRepository.java rename to src/main/java/com/campus/water/mapper/DrinkRecommendationRepository.java diff --git a/src/com/campus/water/mapper/DrinkRecordRepository.java b/src/main/java/com/campus/water/mapper/DrinkRecordRepository.java similarity index 100% rename from src/com/campus/water/mapper/DrinkRecordRepository.java rename to src/main/java/com/campus/water/mapper/DrinkRecordRepository.java diff --git a/src/com/campus/water/mapper/InspectionRecordRepository.java b/src/main/java/com/campus/water/mapper/InspectionRecordRepository.java similarity index 100% rename from src/com/campus/water/mapper/InspectionRecordRepository.java rename to src/main/java/com/campus/water/mapper/InspectionRecordRepository.java diff --git a/src/com/campus/water/mapper/MaintenancePlanRepository.java b/src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java similarity index 100% rename from src/com/campus/water/mapper/MaintenancePlanRepository.java rename to src/main/java/com/campus/water/mapper/MaintenancePlanRepository.java diff --git a/src/com/campus/water/mapper/MessagePushRepository.java b/src/main/java/com/campus/water/mapper/MessagePushRepository.java similarity index 100% rename from src/com/campus/water/mapper/MessagePushRepository.java rename to src/main/java/com/campus/water/mapper/MessagePushRepository.java diff --git a/src/com/campus/water/mapper/RepairerAuthRepository.java b/src/main/java/com/campus/water/mapper/RepairerAuthRepository.java similarity index 100% rename from src/com/campus/water/mapper/RepairerAuthRepository.java rename to src/main/java/com/campus/water/mapper/RepairerAuthRepository.java diff --git a/src/com/campus/water/mapper/RepairmanRepository.java b/src/main/java/com/campus/water/mapper/RepairmanRepository.java similarity index 100% rename from src/com/campus/water/mapper/RepairmanRepository.java rename to src/main/java/com/campus/water/mapper/RepairmanRepository.java diff --git a/src/com/campus/water/mapper/TerminalUsageStatsRepository.java b/src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java similarity index 100% rename from src/com/campus/water/mapper/TerminalUsageStatsRepository.java rename to src/main/java/com/campus/water/mapper/TerminalUsageStatsRepository.java diff --git a/src/com/campus/water/mapper/UserRepository.java b/src/main/java/com/campus/water/mapper/UserRepository.java similarity index 100% rename from src/com/campus/water/mapper/UserRepository.java rename to src/main/java/com/campus/water/mapper/UserRepository.java diff --git a/src/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java b/src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java similarity index 100% rename from src/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java rename to src/main/java/com/campus/water/mapper/WaterMakerRealtimeDataRepository.java diff --git a/src/com/campus/water/mapper/WaterQualityHistoryRepository.java b/src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java similarity index 100% rename from src/com/campus/water/mapper/WaterQualityHistoryRepository.java rename to src/main/java/com/campus/water/mapper/WaterQualityHistoryRepository.java diff --git a/src/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java b/src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java similarity index 100% rename from src/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java rename to src/main/java/com/campus/water/mapper/WaterSupplyRealtimeDataRepository.java diff --git a/src/com/campus/water/mapper/WorkOrderRepository.java b/src/main/java/com/campus/water/mapper/WorkOrderRepository.java similarity index 100% rename from src/com/campus/water/mapper/WorkOrderRepository.java rename to src/main/java/com/campus/water/mapper/WorkOrderRepository.java diff --git a/src/com/campus/water/mapper/先读我.md b/src/main/java/com/campus/water/mapper/先读我.md similarity index 100% rename from src/com/campus/water/mapper/先读我.md rename to src/main/java/com/campus/water/mapper/先读我.md diff --git a/src/main/java/com/campus/water/model/WaterMakerSensorData.java b/src/main/java/com/campus/water/model/WaterMakerSensorData.java new file mode 100644 index 0000000..aa4c0d1 --- /dev/null +++ b/src/main/java/com/campus/water/model/WaterMakerSensorData.java @@ -0,0 +1,23 @@ +package com.campus.water.model; + +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 制水机传感器数据模型(与MQTT消息格式完全对齐) + * 用于MQTT消息的序列化/反序列化,不直接持久化 + */ +@Data +public class WaterMakerSensorData { + private String deviceId; // 设备唯一ID(如WM001) + private Double tdsValue; // TDS值(水质指标) + private Double waterFlow; // 水流量(L/min) + private Double waterPressure; // 水压(MPa) + private Integer filterLife; // 滤芯寿命(%) + private Boolean leakage; // 是否漏水(true=漏水,false=正常) + private Double temperature; // 水温(℃) + private Double humidity; // 环境湿度(%RH) + private String waterQuality; // 水质等级(合格/不合格) + private String status; // 设备状态(normal=正常,error=异常) + private LocalDateTime timestamp; // 数据采集时间戳 +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/model/WaterSupplySensorData.java b/src/main/java/com/campus/water/model/WaterSupplySensorData.java new file mode 100644 index 0000000..bf8ec47 --- /dev/null +++ b/src/main/java/com/campus/water/model/WaterSupplySensorData.java @@ -0,0 +1,20 @@ +package com.campus.water.model; + +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 供水机传感器数据模型(与MQTT消息格式完全对齐) + * 用于MQTT消息的序列化/反序列化,不直接持久化 + */ +@Data +public class WaterSupplySensorData { + private String deviceId; // 设备唯一ID(如WS001) + private Double waterFlow; // 水流量(L/min) + private Double waterPressure; // 水压(MPa) + private Double waterLevel; // 水位(%) + private Double temperature; // 水温(℃) + private Double humidity; // 环境湿度(%RH) + private String status; // 设备状态(normal=正常,error=异常) + private LocalDateTime timestamp; // 数据采集时间戳 +} \ No newline at end of file diff --git a/src/com/campus/water/security/先读我.md b/src/main/java/com/campus/water/security/先读我.md similarity index 100% rename from src/com/campus/water/security/先读我.md rename to src/main/java/com/campus/water/security/先读我.md diff --git a/src/main/java/com/campus/water/service/MqttSensorReceiver.java b/src/main/java/com/campus/water/service/MqttSensorReceiver.java new file mode 100644 index 0000000..c8af40e --- /dev/null +++ b/src/main/java/com/campus/water/service/MqttSensorReceiver.java @@ -0,0 +1,183 @@ +package com.campus.water.service; + +import com.campus.water.config.MqttConfig; +import com.campus.water.entity.Alert; +import com.campus.water.entity.WaterMakerRealtimeData; +import com.campus.water.entity.WaterSupplyRealtimeData; +import com.campus.water.mapper.AlertRepository; +import com.campus.water.mapper.WaterMakerRealtimeDataRepository; +import com.campus.water.mapper.WaterSupplyRealtimeDataRepository; +import com.campus.water.model.WaterMakerSensorData; +import com.campus.water.model.WaterSupplySensorData; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.integration.annotation.ServiceActivator; +import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter; +import org.springframework.integration.mqtt.support.MqttHeaders; +import org.springframework.messaging.handler.annotation.Header; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import java.time.LocalDateTime; + +@Service +@RequiredArgsConstructor +@Slf4j +public class MqttSensorReceiver { + // JPA Repository(数据持久化接口,Spring自动注入实现) + private final WaterMakerRealtimeDataRepository waterMakerRepo; + private final WaterSupplyRealtimeDataRepository waterSupplyRepo; + private final AlertRepository alertRepo; + private final ObjectMapper objectMapper; + private final MqttPahoMessageDrivenChannelAdapter mqttAdapter; + + /** + * 项目启动后初始化:订阅所有需要的MQTT主题 + * 主题后缀用「+」表示通配符(匹配所有设备ID) + */ + @PostConstruct + public void initMqttSubscription() { + mqttAdapter.addTopic(MqttConfig.TOPIC_WATER_MAKER_STATE + "+"); // 制水机状态(所有设备) + mqttAdapter.addTopic(MqttConfig.TOPIC_WATER_MAKER_WARN + "+"); // 制水机告警(所有设备) + mqttAdapter.addTopic(MqttConfig.TOPIC_WATER_SUPPLIER_STATE + "+"); // 供水机状态(所有设备) + mqttAdapter.addTopic(MqttConfig.TOPIC_WATER_SUPPLIER_WARN + "+"); // 供水机告警(所有设备) + log.info("MQTT订阅初始化完成 | 订阅主题:{}+、{}+、{}+、{}+", + MqttConfig.TOPIC_WATER_MAKER_STATE, + MqttConfig.TOPIC_WATER_MAKER_WARN, + MqttConfig.TOPIC_WATER_SUPPLIER_STATE, + MqttConfig.TOPIC_WATER_SUPPLIER_WARN); + } + + /** + * 监听MQTT接收通道,处理所有收到的消息 + * @param payload 消息内容(JSON字符串) + * @param topic 接收主题(用于区分消息类型) + */ + @ServiceActivator(inputChannel = "mqttInputChannel") + public void handleMqttMessage(String payload, @Header(MqttHeaders.RECEIVED_TOPIC) String topic) { + log.info("MQTT消息接收成功 | 主题:{} | 内容:{}", topic, payload); + + try { + // 根据主题分类处理 + if (topic.startsWith(MqttConfig.TOPIC_WATER_MAKER_STATE)) { + handleWaterMakerState(payload); // 制水机状态数据 + } else if (topic.startsWith(MqttConfig.TOPIC_WATER_MAKER_WARN)) { + handleWaterMakerWarning(payload); // 制水机告警数据 + } else if (topic.startsWith(MqttConfig.TOPIC_WATER_SUPPLIER_STATE)) { + handleWaterSupplyState(payload); // 供水机状态数据 + } else if (topic.startsWith(MqttConfig.TOPIC_WATER_SUPPLIER_WARN)) { + handleWaterSupplyWarning(payload); // 供水机告警数据 + } else { + log.warn("MQTT消息主题未匹配 | 未知主题:{} | 内容:{}", topic, payload); + } + } catch (Exception e) { + log.error("MQTT消息处理失败 | 主题:{} | 内容:{} | 异常:{}", topic, payload, e.getMessage()); + } + } + + /** + * 处理制水机状态数据:转换为JPA实体并持久化 + */ + private void handleWaterMakerState(String payload) throws Exception { + // 1. JSON反序列化为模型对象 + WaterMakerSensorData sensorData = objectMapper.readValue(payload, WaterMakerSensorData.class); + + // 2. 模型对象转换为JPA实体(持久化到数据库) + WaterMakerRealtimeData entity = new WaterMakerRealtimeData(); + entity.setDeviceId(sensorData.getDeviceId()); + entity.setTdsValue(sensorData.getTdsValue()); + entity.setWaterFlow(sensorData.getWaterFlow()); + entity.setWaterPressure(sensorData.getWaterPressure()); + entity.setFilterLife(sensorData.getFilterLife()); + entity.setLeakage(sensorData.getLeakage() ? 1 : 0); // 数据库存储:1=漏水,0=正常 + entity.setTemperature(sensorData.getTemperature()); + entity.setHumidity(sensorData.getHumidity()); + entity.setWaterQuality(sensorData.getWaterQuality()); + entity.setStatus(WaterMakerRealtimeData.DeviceStatus.valueOf(sensorData.getStatus().toUpperCase())); + entity.setTimestamp(sensorData.getTimestamp()); + entity.setCreatedTime(LocalDateTime.now()); + + // 3. 持久化到数据库(JPA save() 自动实现CRUD) + waterMakerRepo.save(entity); + log.info("制水机状态数据持久化成功 | 设备ID:{}", sensorData.getDeviceId()); + } + + /** + * 处理制水机告警数据:持久化告警记录+状态数据 + */ + private void handleWaterMakerWarning(String payload) throws Exception { + WaterMakerSensorData sensorData = objectMapper.readValue(payload, WaterMakerSensorData.class); + + // 1. 持久化告警记录 + Alert alert = new Alert(); + alert.setDeviceId(sensorData.getDeviceId()); + alert.setAlertType("WATER_MAKER_ABNORMAL"); // 告警类型(枚举规范) + alert.setAlertLevel(Alert.AlertLevel.CRITICAL); // 告警级别(严重) + alert.setAlertMessage(String.format( + "制水机异常 - 设备ID:%s,TDS值:%.2f,滤芯寿命:%d%%,漏水状态:%s", + sensorData.getDeviceId(), + sensorData.getTdsValue(), + sensorData.getFilterLife(), + sensorData.getLeakage() ? "是" : "否" + )); + alert.setStatus(Alert.AlertStatus.PENDING); // 告警状态(未处理) + alert.setTimestamp(sensorData.getTimestamp()); + alert.setCreateTime(LocalDateTime.now()); + + alertRepo.save(alert); + log.warn("制水机告警记录持久化成功 | 告警ID:{} | 设备ID:{}", alert.getId(), sensorData.getDeviceId()); + + // 2. 同时持久化状态数据(便于后续追溯) + handleWaterMakerState(payload); + } + + /** + * 处理供水机状态数据:转换为JPA实体并持久化 + */ + private void handleWaterSupplyState(String payload) throws Exception { + WaterSupplySensorData sensorData = objectMapper.readValue(payload, WaterSupplySensorData.class); + + WaterSupplyRealtimeData entity = new WaterSupplyRealtimeData(); + entity.setDeviceId(sensorData.getDeviceId()); + entity.setWaterFlow(sensorData.getWaterFlow()); + entity.setWaterPressure(sensorData.getWaterPressure()); + entity.setWaterLevel(sensorData.getWaterLevel()); + entity.setTemperature(sensorData.getTemperature()); + entity.setHumidity(sensorData.getHumidity()); + entity.setStatus(WaterSupplyRealtimeData.DeviceStatus.valueOf(sensorData.getStatus().toUpperCase())); + entity.setTimestamp(sensorData.getTimestamp()); + entity.setCreatedTime(LocalDateTime.now()); + + waterSupplyRepo.save(entity); + log.info("供水机状态数据持久化成功 | 设备ID:{}", sensorData.getDeviceId()); + } + + /** + * 处理供水机告警数据:持久化告警记录+状态数据 + */ + private void handleWaterSupplyWarning(String payload) throws Exception { + WaterSupplySensorData sensorData = objectMapper.readValue(payload, WaterSupplySensorData.class); + + // 1. 持久化告警记录 + Alert alert = new Alert(); + alert.setDeviceId(sensorData.getDeviceId()); + alert.setAlertType("WATER_SUPPLY_ABNORMAL"); + alert.setAlertLevel(Alert.AlertLevel.ERROR); + alert.setAlertMessage(String.format( + "供水机异常 - 设备ID:%s,水压:%.2fMPa,水位:%.2f%%", + sensorData.getDeviceId(), + sensorData.getWaterPressure(), + sensorData.getWaterLevel() + )); + alert.setStatus(Alert.AlertStatus.PENDING); + alert.setTimestamp(sensorData.getTimestamp()); + alert.setCreateTime(LocalDateTime.now()); + + alertRepo.save(alert); + log.warn("供水机告警记录持久化成功 | 告警ID:{} | 设备ID:{}", alert.getId(), sensorData.getDeviceId()); + + // 2. 同时持久化状态数据 + handleWaterSupplyState(payload); + } +} \ No newline at end of file diff --git a/src/main/java/com/campus/water/service/MqttSensorSender.java b/src/main/java/com/campus/water/service/MqttSensorSender.java new file mode 100644 index 0000000..e553b73 --- /dev/null +++ b/src/main/java/com/campus/water/service/MqttSensorSender.java @@ -0,0 +1,133 @@ +package com.campus.water.service; + +import com.campus.water.config.MqttConfig; +import com.campus.water.model.WaterMakerSensorData; +import com.campus.water.model.WaterSupplySensorData; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.support.MessageBuilder; +import org.springframework.stereotype.Service; +import org.springframework.util.MimeTypeUtils; + +import java.time.LocalDateTime; +import java.util.Random; + +@Service +@RequiredArgsConstructor +@Slf4j // 日志注解(替代System.out) +public class MqttSensorSender { + private final MqttPahoMessageHandler mqttMessageHandler; + private final ObjectMapper objectMapper; // JSON序列化工具(Spring默认注入) + private final Random random = new Random(); // 生成模拟数据 + + /** + * 模拟制水机发送「正常状态数据」 + * @param deviceId 设备ID(如WM001) + */ + public void sendWaterMakerState(String deviceId) { + try { + // 1. 构建模拟数据(符合正常业务范围) + WaterMakerSensorData data = new WaterMakerSensorData(); + data.setDeviceId(deviceId); + data.setTdsValue(50 + random.nextDouble() * 30); // 50-80(正常范围) + data.setWaterFlow(random.nextDouble() * 2); // 0-2 L/min + data.setWaterPressure(0.2 + random.nextDouble() * 0.3); // 0.2-0.5 MPa + data.setFilterLife(30 + random.nextInt(70)); // 30-100% + data.setLeakage(random.nextBoolean() && random.nextBoolean()); // 漏水概率较低(25%) + data.setTemperature(20 + random.nextDouble() * 5); // 20-25℃ + data.setHumidity(40 + random.nextDouble() * 20); // 40-60%RH + data.setWaterQuality("合格"); + data.setStatus("normal"); + data.setTimestamp(LocalDateTime.now()); + + // 2. 序列化JSON(MQTT消息 payload 为JSON字符串) + String payload = objectMapper.writeValueAsString(data); + // 3. 构建主题(设备ID作为主题后缀,精准订阅) + String topic = MqttConfig.TOPIC_WATER_MAKER_STATE + deviceId; + + // 4. 发送MQTT消息 + sendMessage(topic, payload); + log.info("制水机状态消息发送成功 | 设备ID:{} | 主题:{} | 数据:{}", deviceId, topic, payload); + } catch (JsonProcessingException e) { + log.error("制水机状态消息发送失败 | 设备ID:{} | 异常:{}", deviceId, e.getMessage()); + } + } + + /** + * 模拟制水机发送「告警数据」 + * @param deviceId 设备ID(如WM001) + */ + public void sendWaterMakerWarning(String deviceId) { + try { + // 1. 构建异常数据(超出正常范围) + WaterMakerSensorData data = new WaterMakerSensorData(); + data.setDeviceId(deviceId); + data.setTdsValue(150 + random.nextDouble() * 50); // 150-200(异常范围) + data.setWaterFlow(0.1 + random.nextDouble() * 0.3); // 流量极低 + data.setWaterPressure(0.1 + random.nextDouble() * 0.1); // 水压过低(0.1-0.2 MPa) + data.setFilterLife(5 + random.nextInt(10)); // 滤芯寿命低(5-15%) + data.setLeakage(true); // 强制漏水 + data.setTemperature(28 + random.nextDouble() * 3); // 水温过高(28-31℃) + data.setStatus("error"); + data.setTimestamp(LocalDateTime.now()); + + // 2. 序列化+发送 + String payload = objectMapper.writeValueAsString(data); + String topic = MqttConfig.TOPIC_WATER_MAKER_WARN + deviceId; + sendMessage(topic, payload); + log.warn("制水机告警消息发送成功 | 设备ID:{} | 主题:{} | 数据:{}", deviceId, topic, payload); + } catch (JsonProcessingException e) { + log.error("制水机告警消息发送失败 | 设备ID:{} | 异常:{}", deviceId, e.getMessage()); + } + } + + /** + * 模拟供水机发送「正常状态数据」 + * @param deviceId 设备ID(如WS001) + */ + public void sendWaterSupplyData(String deviceId) { + try { + // 1. 构建模拟数据 + WaterSupplySensorData data = new WaterSupplySensorData(); + data.setDeviceId(deviceId); + data.setWaterFlow(random.nextDouble() * 3); // 0-3 L/min + data.setWaterPressure(0.1 + random.nextDouble() * 0.2); // 0.1-0.3 MPa + data.setWaterLevel(30 + random.nextDouble() * 50); // 30-80% + data.setTemperature(18 + random.nextDouble() * 4); // 18-22℃ + data.setHumidity(35 + random.nextDouble() * 15); // 35-50%RH + data.setStatus("normal"); + data.setTimestamp(LocalDateTime.now()); + + // 2. 序列化+发送 + String payload = objectMapper.writeValueAsString(data); + String topic = MqttConfig.TOPIC_WATER_SUPPLIER_STATE + deviceId; + sendMessage(topic, payload); + log.info("供水机状态消息发送成功 | 设备ID:{} | 主题:{} | 数据:{}", deviceId, topic, payload); + } catch (JsonProcessingException e) { + log.error("供水机状态消息发送失败 | 设备ID:{} | 异常:{}", deviceId, e.getMessage()); + } + } + + /** + * 通用发送方法(封装MQTT消息构建逻辑) + * @param topic 主题 + * @param payload 消息内容(JSON字符串) + */ + private void sendMessage(String topic, String payload) { + // 构建Spring Messaging消息(指定JSON格式、主题、QOS) + Message message = MessageBuilder + .withPayload(payload) + .setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON) + .setHeader("mqtt_topic", topic) + .setHeader("mqtt_qos", MqttConfig.QOS) + .build(); + + // 调用处理器发送消息 + mqttMessageHandler.handleMessage(message); + } +} \ No newline at end of file diff --git a/src/com/campus/water/service/先读我.md b/src/main/java/com/campus/water/service/先读我.md similarity index 100% rename from src/com/campus/water/service/先读我.md rename to src/main/java/com/campus/water/service/先读我.md diff --git a/src/main/java/com/campus/water/task/SensorSimulationTask.java b/src/main/java/com/campus/water/task/SensorSimulationTask.java new file mode 100644 index 0000000..4835f8e --- /dev/null +++ b/src/main/java/com/campus/water/task/SensorSimulationTask.java @@ -0,0 +1,68 @@ +package com.campus.water.task; + +import com.campus.water.service.MqttSensorSender; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +@RequiredArgsConstructor +@Slf4j +public class SensorSimulationTask { + private final MqttSensorSender mqttSensorSender; + + // 模拟已部署的设备列表(实际项目可从数据库查询) + private final List waterMakerDevices = new ArrayList<>() {{ + add("WM001"); // 制水机1 + add("WM002"); // 制水机2 + add("WM003"); // 制水机3 + add("WM004"); // 制水机4 + }}; + + private final List waterSupplyDevices = new ArrayList<>() {{ + add("WS001"); // 供水机1 + add("WS002"); // 供水机2 + add("WS003"); // 供水机3 + }}; + + /** + * 定时发送「正常状态数据」:每30秒执行一次 + * fixedRate:固定间隔(从上一次任务开始时间计算) + */ + @Scheduled(fixedRate = 30000) + public void sendRegularStateData() { + log.info("=== 开始发送设备正常状态数据 ==="); + + // 1. 发送所有制水机状态 + for (String deviceId : waterMakerDevices) { + mqttSensorSender.sendWaterMakerState(deviceId); + } + + // 2. 发送所有供水机状态 + for (String deviceId : waterSupplyDevices) { + mqttSensorSender.sendWaterSupplyData(deviceId); + } + + log.info("=== 设备正常状态数据发送完成 ==="); + } + + /** + * 定时发送「随机告警数据」:每5分钟执行一次 + * fixedRate:固定间隔(从上一次任务开始时间计算) + */ + @Scheduled(fixedRate = 300000) + public void sendRandomWarningData() { + log.info("=== 开始发送随机告警数据 ==="); + + // 随机选择1台制水机发送告警(模拟设备故障) + int randomIndex = (int) (Math.random() * waterMakerDevices.size()); + String targetDevice = waterMakerDevices.get(randomIndex); + mqttSensorSender.sendWaterMakerWarning(targetDevice); + + log.info("=== 随机告警数据发送完成 | 告警设备:{} ===", targetDevice); + } +} \ No newline at end of file diff --git a/src/com/campus/water/util/先读我.md b/src/main/java/com/campus/water/util/先读我.md similarity index 100% rename from src/com/campus/water/util/先读我.md rename to src/main/java/com/campus/water/util/先读我.md diff --git a/src/com/campus/water/view/先读我.md b/src/main/java/com/campus/water/view/先读我.md similarity index 100% rename from src/com/campus/water/view/先读我.md rename to src/main/java/com/campus/water/view/先读我.md diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..942fb57 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,49 @@ +# Spring Boot 全局配置文件 +spring: + # 数据库配置(JPA自动集成HikariCP连接池) + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/campus_water?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root # 你的MySQL用户名 + password: 123456 # 你的MySQL密码 + hikari: + maximum-pool-size: 10 # 连接池最大连接数 + idle-timeout: 300000 # 连接空闲超时时间(5分钟) + + # JPA配置(hibernate 自动建表/更新表结构) + jpa: + hibernate: + ddl-auto: update # 开发环境:update(自动更新表结构);生产环境:none + show-sql: true # 控制台打印SQL语句 + properties: + hibernate: + dialect: org.hibernate.dialect.MySQL8Dialect # MySQL 8.0方言 + format_sql: true # SQL格式化(便于调试) + open-in-view: false # 关闭OpenInView模式(避免懒加载异常) + +# 服务器配置 +server: + port: 8080 # 项目启动端口 + servlet: + context-path: /water # 接口前缀(如http://localhost:8080/water) + tomcat: + uri-encoding: UTF-8 # 编码格式(避免中文乱码) + +# 日志配置(SLF4J + Logback) +logging: + level: + root: INFO # 全局日志级别 + com.campus.water: DEBUG # 项目包日志级别(调试用) + org.springframework.integration.mqtt: INFO # MQTT集成日志级别 + file: + name: logs/water-system.log # 日志文件路径(项目根目录/logs) + max-size: 10MB # 单个日志文件最大10MB + max-history: 7 # 日志保留7天 + total-size-cap: 100MB # 日志总大小限制100MB + +# Jackson配置(JSON序列化/反序列化) +spring.jackson: + date-format: yyyy-MM-dd HH:mm:ss # 日期格式化 + time-zone: GMT+8 # 时区(避免时间偏移) + serialization: + fail-on-empty-beans: false # 允许空对象序列化 \ No newline at end of file From e0e45445760b4ddf698353a7cc11387e5c16d803 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 12:34:48 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../迭代开发计划第一稿.docx | Bin 24527 -> 24677 bytes .../迭代开发计划第二稿 .docx | Bin 24946 -> 24970 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/project/03-计划文档/迭代开发计划第一稿.docx b/doc/project/03-计划文档/迭代开发计划第一稿.docx index a6a7f73985148d9f04907882a1dab6b85a5132c9..53344afc2f9f8d0a181b9ecc7d0b24c690f15d51 100644 GIT binary patch delta 17706 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%0Av6F delta 17545 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 E0MPkN1^@s6 diff --git a/doc/project/03-计划文档/迭代开发计划第二稿 .docx b/doc/project/03-计划文档/迭代开发计划第二稿 .docx index 477fd8e57a2d1fd431ec2ec3182c739efcfe2e8e..42fef3d4b02dfc0aed0c0fb7c8b6f2bc9ace3ab8 100644 GIT binary patch delta 17227 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 VFnNeh4iFWe9Fr)(wj>s$5CG}401^NI delta 17218 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 Date: Mon, 24 Nov 2025 12:40:02 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E5=91=A8=E8=AE=A1=E5=88=92=EF=BC=8C?= =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/week-4/group/weekly-plan-4.md | 2 +- .../weekly/week-4/group/weekly-summary-4.md | 4 +-- .../week-4/members/caojunmao-weekly-plan-4.md | 4 +-- .../members/caojunmao-weekly-summary-4.md | 4 +-- .../weekly/week-5/group/weekly-plan-5.md | 2 +- .../weekly/week-5/group/weekly-summary-5.md | 2 +- .../week-5/members/caojunmao-weekly-plan-5.md | 4 +-- .../members/caojunmao-weekly-summary-05.md | 4 +-- .../weekly/week-6/group/weekly-plan-6.md | 2 +- .../weekly/week-6/group/weekly-summary-6.md | 2 +- .../week-6/members/caojunmao-weekly-plan-6.md | 4 +-- .../members/caojunmao-weekly-summary-06.md | 4 +-- .../weekly/week-7/group/weekly-plan-7.md | 2 +- .../weekly/week-7/group/weekly-summary-7.md | 2 +- .../week-7/members/caojunmao-weekly-plan-7.md | 4 +-- .../members/caojunmao-weekly-summary-07.md | 4 +-- .../weekly/week-8/group/weekly-plan-08.md | 2 +- .../weekly/week-8/group/weekly-summary-8.md | 2 +- .../members/caojunmao-weekly-plan-08.md | 4 +-- .../members/caojunmao-weekly-summary-8.md | 4 +-- .../weekly/week-9/group/weekly-plan-9.md | 2 +- .../weekly/week-9/group/weekly-summary-09.md | 36 +++++++++++++++++++ .../week-9/members/caojunmao-weekly-plan-9.md | 4 +-- 23 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 doc/process/weekly/week-9/group/weekly-summary-09.md diff --git a/doc/process/weekly/week-4/group/weekly-plan-4.md b/doc/process/weekly/week-4/group/weekly-plan-4.md index d686863..374186d 100644 --- a/doc/process/weekly/week-4/group/weekly-plan-4.md +++ b/doc/process/weekly/week-4/group/weekly-plan-4.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-10-13 -**结束时间:** 2023-10-19 +**结束时间:** 2025-10-19 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-4/group/weekly-summary-4.md b/doc/process/weekly/week-4/group/weekly-summary-4.md index 5655cb3..563147e 100644 --- a/doc/process/weekly/week-4/group/weekly-summary-4.md +++ b/doc/process/weekly/week-4/group/weekly-summary-4.md @@ -3,8 +3,8 @@ ## 团队名称和起止时间 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-10-13 -**结束时间:** 2023-10-19 +**开始时间:** 2025-10-13 +**结束时间:** 2025-10-19 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-4/members/caojunmao-weekly-plan-4.md b/doc/process/weekly/week-4/members/caojunmao-weekly-plan-4.md index 90bc20c..35b4886 100644 --- a/doc/process/weekly/week-4/members/caojunmao-weekly-plan-4.md +++ b/doc/process/weekly/week-4/members/caojunmao-weekly-plan-4.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-10-13 -**结束时间:** 2023-10-19 +**开始时间:** 2025-10-13 +**结束时间:** 2025-10-19 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-4/members/caojunmao-weekly-summary-4.md b/doc/process/weekly/week-4/members/caojunmao-weekly-summary-4.md index 9b92585..66dd624 100644 --- a/doc/process/weekly/week-4/members/caojunmao-weekly-summary-4.md +++ b/doc/process/weekly/week-4/members/caojunmao-weekly-summary-4.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-10-13 -**结束时间:** 2023-10-19 +**开始时间:** 2025-10-13 +**结束时间:** 2025-10-19 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-5/group/weekly-plan-5.md b/doc/process/weekly/week-5/group/weekly-plan-5.md index 819f61b..5a21d2a 100644 --- a/doc/process/weekly/week-5/group/weekly-plan-5.md +++ b/doc/process/weekly/week-5/group/weekly-plan-5.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-10-20 -**结束时间:** 2023-10-26 +**结束时间:** 2025-10-26 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-5/group/weekly-summary-5.md b/doc/process/weekly/week-5/group/weekly-summary-5.md index 96944d6..0b61f90 100644 --- a/doc/process/weekly/week-5/group/weekly-summary-5.md +++ b/doc/process/weekly/week-5/group/weekly-summary-5.md @@ -4,7 +4,7 @@ **团队名称:** 1班-汪汪队 **开始时间:** 2023-10-19 -**结束时间:** 2023-10-26 +**结束时间:** 2025-10-26 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-5/members/caojunmao-weekly-plan-5.md b/doc/process/weekly/week-5/members/caojunmao-weekly-plan-5.md index 4d30b6b..f35df75 100644 --- a/doc/process/weekly/week-5/members/caojunmao-weekly-plan-5.md +++ b/doc/process/weekly/week-5/members/caojunmao-weekly-plan-5.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-10-20 -**结束时间:** 2023-10-26 +**开始时间:** 2025-10-20 +**结束时间:** 2025-10-26 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-5/members/caojunmao-weekly-summary-05.md b/doc/process/weekly/week-5/members/caojunmao-weekly-summary-05.md index 62aeebe..50ad560 100644 --- a/doc/process/weekly/week-5/members/caojunmao-weekly-summary-05.md +++ b/doc/process/weekly/week-5/members/caojunmao-weekly-summary-05.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-10-20 -**结束时间:** 2023-10-26 +**开始时间:** 2025-10-20 +**结束时间:** 2025-10-26 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-6/group/weekly-plan-6.md b/doc/process/weekly/week-6/group/weekly-plan-6.md index 5975104..9ca7433 100644 --- a/doc/process/weekly/week-6/group/weekly-plan-6.md +++ b/doc/process/weekly/week-6/group/weekly-plan-6.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-10-27 -**结束时间:** 2023-11-2 +**结束时间:** 2025-11-2 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-6/group/weekly-summary-6.md b/doc/process/weekly/week-6/group/weekly-summary-6.md index ac9e98e..6e0c300 100644 --- a/doc/process/weekly/week-6/group/weekly-summary-6.md +++ b/doc/process/weekly/week-6/group/weekly-summary-6.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-10-27 -**结束时间:** 2023-11-2 +**结束时间:** 2025-11-2 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-6/members/caojunmao-weekly-plan-6.md b/doc/process/weekly/week-6/members/caojunmao-weekly-plan-6.md index 89f2098..6726bdc 100644 --- a/doc/process/weekly/week-6/members/caojunmao-weekly-plan-6.md +++ b/doc/process/weekly/week-6/members/caojunmao-weekly-plan-6.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-10-27 -**结束时间:** 2023-11-2 +**开始时间:** 2025-10-27 +**结束时间:** 2025-11-2 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-6/members/caojunmao-weekly-summary-06.md b/doc/process/weekly/week-6/members/caojunmao-weekly-summary-06.md index 91a7f27..281713c 100644 --- a/doc/process/weekly/week-6/members/caojunmao-weekly-summary-06.md +++ b/doc/process/weekly/week-6/members/caojunmao-weekly-summary-06.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-10-27 -**结束时间:** 2023-11-2 +**开始时间:** 2025-10-27 +**结束时间:** 2025-11-2 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-7/group/weekly-plan-7.md b/doc/process/weekly/week-7/group/weekly-plan-7.md index 91d7e36..3d289d4 100644 --- a/doc/process/weekly/week-7/group/weekly-plan-7.md +++ b/doc/process/weekly/week-7/group/weekly-plan-7.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-11-3 -**结束时间:** 2023-11-9 +**结束时间:** 2025-11-9 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-7/group/weekly-summary-7.md b/doc/process/weekly/week-7/group/weekly-summary-7.md index bfc52d6..506be3d 100644 --- a/doc/process/weekly/week-7/group/weekly-summary-7.md +++ b/doc/process/weekly/week-7/group/weekly-summary-7.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-11-3 -**结束时间:** 2023-11-9 +**结束时间:** 2025-11-9 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-7/members/caojunmao-weekly-plan-7.md b/doc/process/weekly/week-7/members/caojunmao-weekly-plan-7.md index 0862dd5..7907c68 100644 --- a/doc/process/weekly/week-7/members/caojunmao-weekly-plan-7.md +++ b/doc/process/weekly/week-7/members/caojunmao-weekly-plan-7.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-11-3 -**结束时间:** 2023-11-9 +**开始时间:** 2025-11-3 +**结束时间:** 2025-11-9 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md b/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md index a20ea77..70f7696 100644 --- a/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md +++ b/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-11-3 -**结束时间:** 2023-11-9 +**开始时间:** 2025-11-3 +**结束时间:** 2025-11-9 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-8/group/weekly-plan-08.md b/doc/process/weekly/week-8/group/weekly-plan-08.md index f1d0a64..7662e23 100644 --- a/doc/process/weekly/week-8/group/weekly-plan-08.md +++ b/doc/process/weekly/week-8/group/weekly-plan-08.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-11-10 -**结束时间:** 2023-11-16 +**结束时间:** 2025-11-16 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-8/group/weekly-summary-8.md b/doc/process/weekly/week-8/group/weekly-summary-8.md index f2ad98f..41fa4cc 100644 --- a/doc/process/weekly/week-8/group/weekly-summary-8.md +++ b/doc/process/weekly/week-8/group/weekly-summary-8.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-11-10 -**结束时间:** 2023-11-16 +**结束时间:** 2025-11-16 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-8/members/caojunmao-weekly-plan-08.md b/doc/process/weekly/week-8/members/caojunmao-weekly-plan-08.md index 7246dcd..5223863 100644 --- a/doc/process/weekly/week-8/members/caojunmao-weekly-plan-08.md +++ b/doc/process/weekly/week-8/members/caojunmao-weekly-plan-08.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-11-3 -**结束时间:** 2023-11-9 +**开始时间:** 2025-11-3 +**结束时间:** 2025-11-9 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md b/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md index 879cd7b..2da96c4 100644 --- a/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md +++ b/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 1班-汪汪队 -**开始时间:** 2023-11-10 -**结束时间:** 2023-11-16 +**开始时间:** 2025-11-10 +**结束时间:** 2025-11-16 ## 本周任务完成情况 diff --git a/doc/process/weekly/week-9/group/weekly-plan-9.md b/doc/process/weekly/week-9/group/weekly-plan-9.md index 99e803a..cf89f2c 100644 --- a/doc/process/weekly/week-9/group/weekly-plan-9.md +++ b/doc/process/weekly/week-9/group/weekly-plan-9.md @@ -4,7 +4,7 @@ **团队名称:** 软1-汪汪队 **开始时间:** 2025-11-17 -**结束时间:** 2023-11-23 +**结束时间:** 2025-11-23 ## 本周任务计划安排 diff --git a/doc/process/weekly/week-9/group/weekly-summary-09.md b/doc/process/weekly/week-9/group/weekly-summary-09.md new file mode 100644 index 0000000..e6303b0 --- /dev/null +++ b/doc/process/weekly/week-9/group/weekly-summary-09.md @@ -0,0 +1,36 @@ +# 小组周总结-第8周 + +## 团队名称和起止时间 + +**团队名称:** 软1-汪汪队 +**开始时间:** 2025-11-17 +**结束时间:** 2025-11-23 + +## 本周任务计划安排 + + +| 序号 | 总结内容 | 是否完成 | 情况说明 | +|----|--------------|------|------------------------------| +| 1 | 确定本周计划分工 | 完成 | 2023-11-10 开会确定计划以及团队分工 | +| 2 | 与老师讨论开发计划及原型缺陷 | 完成 | 讨论开发计划及现有缺陷 | +| 3 | 学习 | 完成 | 继续学习相关知识,在做中学 | +| 4 | 改正原型页面并向边耐政老师展示 | 完成 | 根据小班讨论要求修正原型 | +|5|提交数据库设计文档| 完成 |根据评审意见修改后提交数据库设计文档| +|6|提交迭代开发计划|完成|与老师讨论开发计划后完成迭代开发计划第一稿| +## 小结 + +1. **增强自信心:** 小组成员应增强自信心,发挥想象力和创造力,在原型设计环节积极思考。 +2. **沟通协作:** 小组成员应积极主动沟通,遇到困难及时寻求帮助,也可以主动向指导老师及研究生学长寻求建议。 +3. **学习安排:** 小组成员仍处于软件开发专业知识的初步学习阶段,应合理安排自主学习时间,以便后续开发的顺利进行。 +4. **项目管理:** PM及时推进项目流程,确保项目有条不紊。 + +--- + +## 【注】 + +1. 在小结一栏中写出希望得到如何的帮助,如讲座等; +2. 请将个人计划和总结提前发给负责人; +3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交; +4. PM综合本小组成员工作情况提交小组周计划、周总结报告,按时上传至代码托管平台。 + +--- \ No newline at end of file diff --git a/doc/process/weekly/week-9/members/caojunmao-weekly-plan-9.md b/doc/process/weekly/week-9/members/caojunmao-weekly-plan-9.md index 1a849ae..f82efea 100644 --- a/doc/process/weekly/week-9/members/caojunmao-weekly-plan-9.md +++ b/doc/process/weekly/week-9/members/caojunmao-weekly-plan-9.md @@ -4,8 +4,8 @@ **姓  名:** 曹峻茂 **团队名称:** 软1-汪汪队 -**开始时间:** 2023-11-17 -**结束时间:** 2023-11-23 +**开始时间:** 2025-11-17 +**结束时间:** 2025-11-23 ## 本周任务计划安排 From 1a021dd39b0dc63f7af96eb4b18ec8454b4f5724 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 12:45:32 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E5=91=A8=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../members/caojunmao-weekly-summary-07.md | 2 +- .../members/caojunmao-weekly-summary-8.md | 3 +- .../weekly/week-9/group/weekly-summary-09.md | 16 ++++----- .../members/caojunmao-weekly-summary-9.md | 36 +++++++++++++++++++ 4 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 doc/process/weekly/week-9/members/caojunmao-weekly-summary-9.md diff --git a/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md b/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md index 70f7696..720bff6 100644 --- a/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md +++ b/doc/process/weekly/week-7/members/caojunmao-weekly-summary-07.md @@ -23,7 +23,7 @@ ## 小结 -1. **设计用例文档:** 完成了用例文档初稿; +1. **设计用例文档:** 完成了用例文档最终稿; 2. **技能学习:** 学习了用例图,用例文档相关知识; 3. **项目管理:** 作为PM及时推进项目进度,确保工作有条不紊; 4. **团队协作**:与团队成员保持良好的沟通协作,确保设计方向与产品需求一致 diff --git a/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md b/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md index 2da96c4..60d8540 100644 --- a/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md +++ b/doc/process/weekly/week-8/members/caojunmao-weekly-summary-8.md @@ -23,8 +23,7 @@ ## 小结 -1. **设计用例文档:** 完成了用例文档初稿; -2. **技能学习:** 学习了用例图,用例文档相关知识; + 3. **项目管理:** 作为PM及时推进项目进度,确保工作有条不紊; 4. **团队协作**:与团队成员保持良好的沟通协作,确保设计方向与产品需求一致 diff --git a/doc/process/weekly/week-9/group/weekly-summary-09.md b/doc/process/weekly/week-9/group/weekly-summary-09.md index e6303b0..68d051c 100644 --- a/doc/process/weekly/week-9/group/weekly-summary-09.md +++ b/doc/process/weekly/week-9/group/weekly-summary-09.md @@ -1,4 +1,4 @@ -# 小组周总结-第8周 +# 小组周总结-第9周 ## 团队名称和起止时间 @@ -11,18 +11,18 @@ | 序号 | 总结内容 | 是否完成 | 情况说明 | |----|--------------|------|------------------------------| -| 1 | 确定本周计划分工 | 完成 | 2023-11-10 开会确定计划以及团队分工 | -| 2 | 与老师讨论开发计划及原型缺陷 | 完成 | 讨论开发计划及现有缺陷 | -| 3 | 学习 | 完成 | 继续学习相关知识,在做中学 | -| 4 | 改正原型页面并向边耐政老师展示 | 完成 | 根据小班讨论要求修正原型 | -|5|提交数据库设计文档| 完成 |根据评审意见修改后提交数据库设计文档| -|6|提交迭代开发计划|完成|与老师讨论开发计划后完成迭代开发计划第一稿| +| 1 | 确定本周计划分工 | 完成 | 2023-11-17 开会确定计划以及团队分工 | +| 2 | 完成mqtt数据生成和接收 | 进行中 | 完成mqtt数据生成和接收功能 | +| 3 | 完成数据库相关基础接口设计和测试 | 进行中 | 完成数据库相关基础接口设计和测试 | +| 4 | 开发维修 / 学生端登录页,完成学生端地图页面布局| 进行中 | 开发维修人员app和学生app登录页,完成学生端地图页面布局 | +|5| 完成Web 端基础框架 + 登录页代码 | 进行中 | 完成管理平台基础框架 + 登录页代码 | +|6|提交迭代开发计划第二稿| 完成 |根据反馈修改迭代开发计划| ## 小结 1. **增强自信心:** 小组成员应增强自信心,发挥想象力和创造力,在原型设计环节积极思考。 2. **沟通协作:** 小组成员应积极主动沟通,遇到困难及时寻求帮助,也可以主动向指导老师及研究生学长寻求建议。 3. **学习安排:** 小组成员仍处于软件开发专业知识的初步学习阶段,应合理安排自主学习时间,以便后续开发的顺利进行。 -4. **项目管理:** PM及时推进项目流程,确保项目有条不紊。 +4. **项目管理:** 原代码框架设计不合理,进行了多次修改 --- diff --git a/doc/process/weekly/week-9/members/caojunmao-weekly-summary-9.md b/doc/process/weekly/week-9/members/caojunmao-weekly-summary-9.md new file mode 100644 index 0000000..1c2d118 --- /dev/null +++ b/doc/process/weekly/week-9/members/caojunmao-weekly-summary-9.md @@ -0,0 +1,36 @@ +# 个人周总结-第9周 + +## 姓名和起止时间 + +**姓  名:** 曹峻茂 +**团队名称:** 1班-汪汪队 +**开始时间:** 2025-11-17 +**结束时间:** 2025-11-23 + +## 本周任务完成情况 + +| 序号 | 总结内容 | 是否完成 | 情况说明 | +|----| ------------------------------------------------ |------|--------------------------------------------------------------| +| 1 | 确定分工 | 完成 | 2023-11-17 开会确定计划和团队分工 | +| 2 | 完成mqtt数据生成和接收 | 进行中 | 完成mqtt数据生成和接收功能 | +| 3 |提交迭代开发计划第二稿| 完成 |根据反馈修改迭代开发计划| + +## 对团队工作的建议 + +1. **互助学习:** 小组成员应该根据自身的技能长短开展互帮互助的活动,共同努力提高小组成员的专业水平; +2. **进度统一:** 团队成员尽量统一项目进度; + +## 小结 + +1. **设计计划文档:** 完成了迭代开发计划第二稿; +2. **项目管理:** 修改了代码框架,符合mvc; +3. **团队协作**:与团队成员保持良好的沟通协作,确保设计方向与产品需求一致 + +--- + +## 【注】 + +1. 在小结一栏中写出希望得到如何的帮助,如讲座等; +2. 请将个人计划和总结提前发给负责人; +3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交; +4. 所有组员都需提交个人周计划、周总结文档,上传至代码托管平台; \ No newline at end of file From cbea9c6ead602b33fc47f8a9d16a1acc589fd8e9 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 12:46:36 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=8D=89=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03-计划文档/~$开发计划第一稿.docx | Bin 162 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/project/03-计划文档/~$开发计划第一稿.docx diff --git a/doc/project/03-计划文档/~$开发计划第一稿.docx b/doc/project/03-计划文档/~$开发计划第一稿.docx deleted file mode 100644 index fcc4ec6a7dab78fd07b9f0a58a68506dff7853d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 gcmZQIvM@6=W*`x;G8i#fFqknIGLWp5M4K2G01p}h6951J From e8f0d3bfb24e12c5116be8e6b23d7b59da29e561 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 12:48:23 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E5=91=A8=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/process/weekly/week-10/group/weekly-plan-10.md | 0 doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/process/weekly/week-10/group/weekly-plan-10.md create mode 100644 doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md diff --git a/doc/process/weekly/week-10/group/weekly-plan-10.md b/doc/process/weekly/week-10/group/weekly-plan-10.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md b/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md new file mode 100644 index 0000000..e69de29 From 4ee5722490802a57529c3f29e0451b381de7bda5 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 13:17:19 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E7=AC=AC=E5=8D=81=E5=91=A8=E8=AE=A1?= =?UTF-8?q?=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/week-10/group/weekly-plan-10.md | 36 +++++++++++++++++++ .../members/caojunmao-weekly-plan-10.md | 33 +++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/doc/process/weekly/week-10/group/weekly-plan-10.md b/doc/process/weekly/week-10/group/weekly-plan-10.md index e69de29..f6c7c62 100644 --- a/doc/process/weekly/week-10/group/weekly-plan-10.md +++ b/doc/process/weekly/week-10/group/weekly-plan-10.md @@ -0,0 +1,36 @@ +# 小组周计划-第10周 + +## 团队名称和起止时间 + +**团队名称:** 软1-汪汪队 +**开始时间:** 2025-11-24 +**结束时间:** 2025-11-30 + +## 本周任务计划安排 + + +| 序号 | 计划内容 | 执行人 | 情况说明 | +|----|-------------------------------------------------|----------------|----------------------------| +| 1 | 确定本周计划分工 | 全体组员 | 2023-11-24 开会确定计划以及团队分工 | +| 2 | 继续完善mqtt数据生成和接收及存储 | 曹峻茂 | 完善mqtt报文与接口 | +| 3 | 开发工单管理接口,扫码用水接口,水质信息查询接口 | 王磊 | 完善相关接口 | +| 4 | 开发学生端扫码模块,水质信息页面,维修端工单抢单 / 拒单功能,工单处理页面,扫码用水触发功能 | 罗月航 | 完善app相关页面 | +| 5 | 开发设备监控页面功能,告警列表页面,开发工单列表页面,与后端联调 | 张红卫 | 开发设备监控页面功能,告警列表页面,开发工单列表页面 | +| 6 |开发告警触发逻辑,完成登录接口|周竞由| 开发告警触发逻辑,完成登录接口,与前端对接 | +| 7 | 前后端联调 | 王磊,周竞由,罗月航,张红卫 | 前后端联调核心流程 | +## 小结 + +2. **沟通协作:** 小组成员应积极主动沟通,遇到困难及时寻求帮助,也可以主动向指导老师及研究生学长寻求建议。 +3. **学习安排:** 小组成员自行学习spring boot相关知识。 +4. **项目管理:** PM及时推进项目流程,确保项目有条不紊。 + +--- + +## 【注】 + +1. 在小结一栏中写出希望得到如何的帮助,如讲座等; +2. 请将个人计划和总结提前发给负责人; +3. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交; +4. PM综合本小组成员工作情况提交小组周计划、周总结报告,按时上传至代码托管平台。 + +--- \ No newline at end of file diff --git a/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md b/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md index e69de29..a710d5e 100644 --- a/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md +++ b/doc/process/weekly/week-10/members/caojunmao-weekly-plan-10.md @@ -0,0 +1,33 @@ +# 个人周计划-第10周 + +## 姓名和起止时间 + +**姓  名:** 曹峻茂 +**团队名称:** 软1-汪汪队 +**开始时间:** 2025-11-24 +**结束时间:** 2025-11-30 + + +## 本周任务计划安排 +| 序号 | 计划内容 | 协作人 | 情况说明 | +|----|--------------------|-----|------------------------| +| 1 | 确定分工 | 组员 | 2023-11-24 开会确定计划和团队分工 | +| 2 | 继续完善mqtt数据生成和接收及存储 | 个人 | 优化模拟器,支持手动触发异常数据(如模拟漏水、TDS 超标),增加断网重连功能。 | + + +## 小结 + +1. **学习需求:** 希望能有对于mqtt应用的教学; +2. **知识储备:** 学习后续需要使用的知识,为后续的开发做准备; +3. **文档撰写:** 完成迭代开发计划撰写。 +4. **代码实现** 参与mqtt协议相关设计 +--- + +## 【注】 + +1. 在小结一栏中写出希望得到如何的帮助,如讲座等; +1. 请将个人计划和总结提前发给负责人; +1. 周任务总结与计划是项目小组评分考核的重要依据,将直接记入平时成绩,请各位同学按要求认真填写并按时提交; +1. 所有组员都需提交个人周计划、周总结文档,按时上传至代码托管平台; + +--- \ No newline at end of file From 879b55795cbd9b6eab4b7b325d9577377121d202 Mon Sep 17 00:00:00 2001 From: tianyuan <2861334240@qq.com> Date: Mon, 24 Nov 2025 13:24:16 +0800 Subject: [PATCH 8/9] =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../迭代开发计划第二稿 .docx | Bin 24970 -> 24891 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/project/03-计划文档/迭代开发计划第二稿 .docx b/doc/project/03-计划文档/迭代开发计划第二稿 .docx index 42fef3d4b02dfc0aed0c0fb7c8b6f2bc9ace3ab8..0d378f5dbaae4b19327fcfb3b712164a4c725f8b 100644 GIT binary patch delta 16845 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≫{ zkhzP&Kqf(05KYRnEoUhDbrwuX+Eo<%$+V2taiLI{ph z_G+%ZIlQsln1OD6H-KYILW=8lk50f&dzsp;_(fQp0UG=oqA)!1Zp=1fnBn7gZl zS41)k$j*fA2v!mpKv#~3A~WI1A)*njj?DHHScD_|I>{_Vb8yqⅆOhTg6j6dHuag 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 Date: Mon, 24 Nov 2025 16:40:23 +0800 Subject: [PATCH 9/9] =?UTF-8?q?=E7=BD=97=E6=9C=88=E8=88=AA=E7=AC=AC?= =?UTF-8?q?=E4=B9=9D=E5=91=A8=E5=91=A8=E6=80=BB=E7=BB=93=E5=8F=8A=E7=AC=AC?= =?UTF-8?q?=E5=8D=81=E5=91=A8=E5=91=A8=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../members/luoyuehang-weekly-plan-10.md | 31 +++++++++++++++++++ .../members/luoyuehang-weekly-summary-09.md | 30 ++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 doc/process/weekly/week-10/members/luoyuehang-weekly-plan-10.md create mode 100644 doc/process/weekly/week-9/members/luoyuehang-weekly-summary-09.md diff --git a/doc/process/weekly/week-10/members/luoyuehang-weekly-plan-10.md b/doc/process/weekly/week-10/members/luoyuehang-weekly-plan-10.md new file mode 100644 index 0000000..811e483 --- /dev/null +++ b/doc/process/weekly/week-10/members/luoyuehang-weekly-plan-10.md @@ -0,0 +1,31 @@ +# 个人周计划-第10周 + +## 姓名和起止时间 + +**姓  名:** [罗月航] +**团队名称:** 1班-汪汪队 +**开始时间:** 2025-12-24 +**结束时间:** 2025-12-30 + +## 本周任务计划安排 + +| 序号 | 计划内容 | 协作人 | 情况说明 | +| ---- | -------- | ------ | -------- | +| 1 | 完成登录页开发收尾 | 个人 | 完善登录表单验证逻辑,完成上周未完成的登录页面开发工作 | +| 2 | 学生端扫码模块开发 | 个人 | 调用摄像头识别二维码,获取设备ID,实现扫码功能 | +| 3 | 水质信息页面开发 | 个人 | 调用水质查询接口,展示水质数据,包括TDS值、水质等级等信息 | +| 4 | 维修端工单抢单/拒单功能 | 个人 | 调用工单管理接口,实现工单抢单和拒单功能 | +| 5 | 工单处理页面开发 | 个人 | 开发维修内容填写页面,支持维修记录提交 | +| 6 | 学生端扫码用水功能 | 个人 | 调用扫码用水接口,实现用水触发功能 | +| 7 | 与后端联调核心流程 | 后端开发 | 完成所有核心功能的接口联调,确保前后端数据交互正常 | +| 8 | 联调报告编写 | 个人 | 整理联调过程中的问题和解决方案,编写联调报告 | + + +## 小结 + +1. **接口依赖**:需要后端提供完整的扫码、水质查询、工单管理、用水触发等接口文档; +2. **设备权限**:需要处理摄像头调用权限,确保扫码功能在移动端的正常使用; +3. **联调协调**:需要与后端开发同学协调联调时间,确保问题及时解决; +4. **测试支持**:需要测试同学协助进行功能测试,特别是移动端兼容性测试; +5. **时间安排**:本周开发任务较重,需要合理安排时间,确保核心功能按时完成。 + diff --git a/doc/process/weekly/week-9/members/luoyuehang-weekly-summary-09.md b/doc/process/weekly/week-9/members/luoyuehang-weekly-summary-09.md new file mode 100644 index 0000000..c431188 --- /dev/null +++ b/doc/process/weekly/week-9/members/luoyuehang-weekly-summary-09.md @@ -0,0 +1,30 @@ +# 个人周总结-第9周 + +## 姓名和起止时间 + +**姓  名:** [罗月航] +**团队名称:** 1班-汪汪队 +**开始时间:** 2025-11-17 +**结束时间:** 2025-11-23 + +## 本周任务完成情况 + +| 序号 | 总结内容 | 是否完成 | 情况说明 | +| ---- | -------- | -------- | -------- | +| 1 | 开发维修/学生端登录页 | 部分完成 | 已完成登录页面的基础布局和样式设计,实现了用户类型切换功能 | +| 2 | 实现登录表单验证 | 部分完成 | 完成了基础的表单结构搭建,验证逻辑正在开发中 | +| 3 | 学生端地图页面布局 | 部分完成 | 完成了地图页面的整体框架布局和主要功能区域划分 | + +## 对团队工作的建议 + +1. **API文档完善**:建议后端团队尽快提供完整的地图数据接口文档; +2. **设计规范统一**:需要建立统一的设计组件库,提高开发效率; +3. **代码审查机制**:建议建立代码审查流程,确保代码质量; +4. **进度同步**:建议每周进行开发进度同步,及时解决遇到的问题。 + +## 小结 + +1. **基础框架搭建**:成功搭建了登录页和地图页面的基础框架结构; +2. **界面效果实现**:登录页面的视觉效果基本达到设计预期,用户体验良好; +3. **问题发现**:在地图API集成过程中遇到了一些技术难点,需要进一步研究解决; +4. **进度评估**:整体进度符合预期,但部分功能需要延至下周完成;