| doc/device_monitor_integration.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| doc/unattended_upgrade.sql | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/unattended/telemetry/controller/DeviceTelemetryController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/unattended/telemetry/service/DeviceAlarmPushService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/unattended/telemetry/service/DeviceTelemetryService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/unattended/telemetry/service/impl/DeviceTelemetryServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application-dev.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application-tide.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
doc/device_monitor_integration.md
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,55 @@ # 设å¤è¿ç¨çæ§æ¥å ¥è¯´æ ## 饿µæ°æ®ä¸æ¥ PLC æè¾¹ç¼ç½å ³ä½¿ç¨ç»å½åç Bearer Token è°ç¨ï¼ `POST /environmentAccess/deviceMonitor/report` ```json { "deviceLedgerId": 1, "temperature": 72.5, "pressure": 0.86, "vibration": 3.2, "energy": 12.6, "collectTime": "2026-11-03 10:30:00" } ``` æå¡ç«¯ä¼æ ¹æ®è®¾å¤å°è´¦éå¼å¤å® `normal`ã`warning` æ `alarm`ï¼å¼å¸¸ç¶æé¦æ¬¡åºç°æå级æ¶ï¼éè¿ `/environmentAccess/deviceMonitor/alarm-stream` 宿¶æ¨éç»å¨çº¿é¡µé¢ã ## è¿ç¨å¯åç½å ³ å¨é ç½®æä»¶ä¸å¢å ç»ä¸æ§å¶ç½å ³å°åï¼ä»¤ç建议ä»ç¯å¢åé读åï¼ä¸è¦ç´æ¥åå ¥çæ¬åºï¼ ```yaml unattended: device-control: gateway-url: http://127.0.0.1:9000/api/device/control auth-token: ${DEVICE_CONTROL_TOKEN:} ``` ç³»ç»åç½å ³åéï¼ ```json { "deviceId": 1, "deviceName": "ç©ºåæº 1#", "action": "start", "commandTime": "2026-11-03T10:30:00" } ``` ç½å ³è¿åä»»æ 2xx ç¶æç è§ä¸ºè®¾å¤ç¡®è®¤ï¼éåç³»ç»æ´æ°è¿è¡ç¶æï¼è¿æ¥å¤±è´¥æé 2xx æ¶ä¸ä¼ä¿®æ¹ç¶æãæªé ç½®ç½å ³å°åæ¶ä½¿ç¨æ¬å°èè°æ¨¡å¼ã ## èªå¨æ¨¡æéé é»è®¤æ¯ 30 ç§èªå¨çæä¸ç»èè°æ°æ®ãæ¥å ¥çå® PLC/ç½å ³ååºå ³é模æééï¼ ```yaml unattended: telemetry: auto-collect-enabled: false collect-interval-ms: 30000 ``` doc/unattended_upgrade.sql
@@ -99,6 +99,29 @@ KEY `idx_access_plate` (`plate_number`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='é¨ç¦è¿åºè®°å½'; CREATE TABLE IF NOT EXISTS `access_vehicle` ( `id` bigint NOT NULL AUTO_INCREMENT, `plate_number` varchar(32) NOT NULL COMMENT '车çå·', `plate_color` varchar(16) DEFAULT NULL COMMENT '车çé¢è²', `rfid_tag` varchar(64) DEFAULT NULL COMMENT 'RFIDæ ç¾', `carrier_name` varchar(120) DEFAULT NULL COMMENT 'æ¿è¿å', `vehicle_type` varchar(64) DEFAULT NULL COMMENT '车è¾ç±»å', `driver_name` varchar(64) DEFAULT NULL COMMENT '叿ºå§å', `driver_phone` varchar(32) DEFAULT NULL COMMENT '叿ºçµè¯', `valid_start` date DEFAULT NULL COMMENT 'æææå¼å§', `valid_end` date DEFAULT NULL COMMENT 'æææç»æ', `status` varchar(16) DEFAULT 'valid' COMMENT 'ç¶æ valid/disabled', `remark` varchar(255) DEFAULT NULL, `create_user` bigint DEFAULT NULL, `create_time` datetime DEFAULT NULL, `update_user` bigint DEFAULT NULL, `update_time` datetime DEFAULT NULL, `tenant_id` bigint DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_access_vehicle_plate` (`plate_number`), KEY `idx_access_vehicle_rfid` (`rfid_tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='车è¾éè¡ææ'; -- ------------------------------------------------------------ -- 3. æ 人å¼å®å°ç£ ï¼æ©å±å段 -- ------------------------------------------------------------ src/main/java/com/ruoyi/unattended/telemetry/controller/DeviceTelemetryController.java
@@ -6,6 +6,9 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import org.springframework.http.MediaType; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import com.ruoyi.unattended.telemetry.service.DeviceAlarmPushService; import javax.annotation.Resource; import java.util.List; @@ -21,6 +24,9 @@ @Resource private DeviceTelemetryService deviceTelemetryService; @Resource private DeviceAlarmPushService alarmPushService; @GetMapping("/list") @ApiOperation("宿¶çæ§å表") public AjaxResult list() { @@ -31,6 +37,16 @@ @ApiOperation("触å䏿¬¡éé") public AjaxResult collect() { return AjaxResult.success(deviceTelemetryService.collectOnce()); } @PostMapping("/report") @ApiOperation("PLC/è¾¹ç¼ç½å ³ä¸æ¥é¥æµæ°æ®") public AjaxResult report(@RequestBody DeviceTelemetry telemetry) { try { return AjaxResult.success(deviceTelemetryService.report(telemetry)); } catch (IllegalArgumentException e) { return AjaxResult.error(e.getMessage()); } } @GetMapping("/history") @@ -47,6 +63,12 @@ return AjaxResult.success(deviceTelemetryService.alarms()); } @GetMapping(value = "/alarm-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) @ApiOperation("订é 宿¶æ¥è¦æ¨é") public SseEmitter alarmStream() { return alarmPushService.subscribe(); } @PostMapping("/control") @ApiOperation("è¿ç¨å¯å") public AjaxResult control(@RequestBody ControlRequest request) { src/main/java/com/ruoyi/unattended/telemetry/service/DeviceAlarmPushService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.unattended.telemetry.service; import com.ruoyi.unattended.telemetry.dto.DeviceMonitorVo; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; /** * è®¾å¤æ¥è¦ SSE æ¨éä¸å¿ã */ @Slf4j @Component public class DeviceAlarmPushService { private final List<SseEmitter> clients = new CopyOnWriteArrayList<>(); public SseEmitter subscribe() { SseEmitter emitter = new SseEmitter(0L); clients.add(emitter); emitter.onCompletion(() -> clients.remove(emitter)); emitter.onTimeout(() -> clients.remove(emitter)); emitter.onError(error -> clients.remove(emitter)); try { emitter.send(SseEmitter.event() .name("connected") .data(Collections.singletonMap("time", LocalDateTime.now().toString()))); } catch (IOException e) { clients.remove(emitter); } return emitter; } public void publish(DeviceMonitorVo alarm) { for (SseEmitter client : clients) { try { String eventId = alarm.getDeviceId() + "-" + System.currentTimeMillis(); client.send(SseEmitter.event().id(eventId).name("alarm").data(alarm)); } catch (Exception e) { clients.remove(client); } } } /** ä¿æä»£çåæµè§å¨ä¹é´çé¿è¿æ¥ï¼åæ¶æ¸ çå·²æå¼ç客æ·ç«¯ã */ @Scheduled(fixedRate = 25000L) public void heartbeat() { for (SseEmitter client : clients) { try { client.send(SseEmitter.event() .name("heartbeat") .data(Collections.singletonMap("time", LocalDateTime.now().toString()))); } catch (Exception e) { clients.remove(client); } } } } src/main/java/com/ruoyi/unattended/telemetry/service/DeviceTelemetryService.java
@@ -15,6 +15,11 @@ List<DeviceMonitorVo> collectOnce(); /** * æ¥æ¶ PLC/è¾¹ç¼ç½å ³ä¸æ¥ççå®é¥æµæ°æ®ï¼å¹¶ç«å³åéå¼å¤å®ä¸æ¥è¦æ¨é */ DeviceMonitorVo report(DeviceTelemetry telemetry); /** * å½åçæ§æ»è§ */ List<DeviceMonitorVo> monitorList(); src/main/java/com/ruoyi/unattended/telemetry/service/impl/DeviceTelemetryServiceImpl.java
@@ -7,8 +7,16 @@ import com.ruoyi.unattended.telemetry.dto.DeviceMonitorVo; import com.ruoyi.unattended.telemetry.mapper.DeviceTelemetryMapper; import com.ruoyi.unattended.telemetry.pojo.DeviceTelemetry; import com.ruoyi.unattended.telemetry.service.DeviceAlarmPushService; import com.ruoyi.unattended.telemetry.service.DeviceTelemetryService; import lombok.extern.slf4j.Slf4j; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -16,7 +24,9 @@ import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import com.alibaba.fastjson2.JSON; /** * 设å¤é¥æµæå¡ã @@ -36,6 +46,24 @@ @Resource private DeviceTelemetryMapper telemetryMapper; @Resource private DeviceAlarmPushService alarmPushService; @Value("${unattended.device-control.gateway-url:}") private String gatewayUrl; @Value("${unattended.device-control.auth-token:}") private String gatewayToken; @Value("${unattended.telemetry.auto-collect-enabled:true}") private boolean autoCollectEnabled; private final OkHttpClient controlClient = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(8, TimeUnit.SECONDS) .writeTimeout(8, TimeUnit.SECONDS) .build(); private static final BigDecimal DEFAULT_TEMP_MIN = new BigDecimal("20"); private static final BigDecimal DEFAULT_TEMP_MAX = new BigDecimal("80"); private static final BigDecimal DEFAULT_PRESSURE_MIN = new BigDecimal("0.20"); @@ -53,6 +81,7 @@ } LocalDateTime now = LocalDateTime.now(); List<DeviceTelemetry> batch = new ArrayList<>(); Set<Long> alarmDeviceIds = new HashSet<>(); for (DeviceLedger device : devices) { DeviceTelemetry last = telemetryMapper.selectOne( Wrappers.<DeviceTelemetry>lambdaQuery() @@ -65,11 +94,87 @@ telemetry.setDeviceName(device.getDeviceName()); judge(device, telemetry); batch.add(telemetry); if (shouldPush(last, telemetry)) { alarmDeviceIds.add(device.getId()); } } if (!batch.isEmpty()) { saveBatch(batch); } return monitorList(); List<DeviceMonitorVo> result = monitorList(); publishAlarms(result, alarmDeviceIds); return result; } /** * é»è®¤æ¯ 30 ç§éé䏿¬¡ãç°åºæ¥å ¥çå®ç½å ³åå¯å° auto-collect-enabled 设为 falseï¼ * æ¹ç± /report æ¥å£æ¥æ¶ PLC/è¾¹ç¼ç½å ³æ°æ®ã */ @Scheduled(fixedDelayString = "${unattended.telemetry.collect-interval-ms:30000}", initialDelayString = "${unattended.telemetry.initial-delay-ms:10000}") public void scheduledCollect() { if (!autoCollectEnabled) { return; } try { collectOnce(); } catch (Exception e) { log.error("设å¤é¥æµå®æ¶éé失败", e); } } @Override public DeviceMonitorVo report(DeviceTelemetry telemetry) { if (telemetry == null || telemetry.getDeviceLedgerId() == null) { throw new IllegalArgumentException("设å¤idä¸è½ä¸ºç©º"); } DeviceLedger device = deviceLedgerMapper.selectById(telemetry.getDeviceLedgerId()); if (device == null) { throw new IllegalArgumentException("设å¤ä¸åå¨"); } DeviceTelemetry last = latestTelemetry(device.getId()); telemetry.setId(null); telemetry.setDeviceName(device.getDeviceName()); if (telemetry.getCollectTime() == null) { telemetry.setCollectTime(LocalDateTime.now()); } judge(device, telemetry); save(telemetry); DeviceMonitorVo result = monitorList().stream() .filter(item -> device.getId().equals(item.getDeviceId())) .findFirst() .orElseThrow(() -> new IllegalArgumentException("设å¤çæ§æ°æ®çæå¤±è´¥")); if (shouldPush(last, telemetry)) { alarmPushService.publish(result); } return result; } private DeviceTelemetry latestTelemetry(Long deviceId) { return telemetryMapper.selectOne( Wrappers.<DeviceTelemetry>lambdaQuery() .eq(DeviceTelemetry::getDeviceLedgerId, deviceId) .orderByDesc(DeviceTelemetry::getCollectTime) .last("limit 1")); } private boolean shouldPush(DeviceTelemetry previous, DeviceTelemetry current) { int currentLevel = alarmLevel(current == null ? null : current.getStatus()); int previousLevel = alarmLevel(previous == null ? null : previous.getStatus()); return currentLevel > 0 && (previousLevel == 0 || currentLevel > previousLevel); } private int alarmLevel(String status) { if ("alarm".equalsIgnoreCase(status)) return 2; if ("warning".equalsIgnoreCase(status)) return 1; return 0; } private void publishAlarms(List<DeviceMonitorVo> devices, Set<Long> alarmDeviceIds) { if (alarmDeviceIds.isEmpty()) return; devices.stream() .filter(item -> alarmDeviceIds.contains(item.getDeviceId())) .forEach(alarmPushService::publish); } /** @@ -219,6 +324,7 @@ } else { throw new IllegalArgumentException("䏿¯æçæä½:" + action); } Map<String, Object> dispatch = dispatchControl(device, action); DeviceLedger update = new DeviceLedger(); update.setId(deviceId); update.setControlStatus(status); @@ -229,11 +335,61 @@ result.put("deviceName", device.getDeviceName()); result.put("controlStatus", status); result.put("commandTime", LocalDateTime.now().toString()); result.put("message", "running".equals(status) ? "å¯å¨æä»¤å·²ä¸å" : "忢æä»¤å·²ä¸å"); result.putAll(dispatch); boolean localMode = "local".equals(dispatch.get("dispatchMode")); if (localMode) { result.put("message", "æ¬å°èè°ç¶æå·²æ´æ°"); } else { result.put("message", "running".equals(status) ? "设å¤å¯å¨æä»¤å·²ç¡®è®¤" : "设å¤åæ¢æä»¤å·²ç¡®è®¤"); } log.info("[è¿ç¨æ§å¶] deviceId={}, action={}, status={}", deviceId, action, status); return result; } /** * è°ç¨ç»ä¸è®¾å¤æ§å¶ç½å ³ã * æªé ç½®ç½å ³æ¶ä½¿ç¨æ¬å°èè°æ¨¡å¼ï¼ä½¿ç³»ç»å¯å¨ç¡¬ä»¶å°åºå宿ä¸å¡éªæ¶ã */ private Map<String, Object> dispatchControl(DeviceLedger device, String action) { String endpoint = trimToNull(gatewayUrl); Map<String, Object> result = new LinkedHashMap<>(); if (endpoint == null) { result.put("dispatchMode", "local"); result.put("gatewayAcknowledged", true); return result; } Map<String, Object> command = new LinkedHashMap<>(); command.put("deviceId", device.getId()); command.put("deviceName", device.getDeviceName()); command.put("action", action.toLowerCase(Locale.ROOT)); command.put("commandTime", LocalDateTime.now().toString()); RequestBody body = RequestBody.create(JSON.toJSONString(command), MediaType.parse("application/json; charset=utf-8")); Request.Builder builder = new Request.Builder().url(endpoint).post(body); if (trimToNull(gatewayToken) != null) { builder.header("Authorization", "Bearer " + gatewayToken.trim()); } try (Response response = controlClient.newCall(builder.build()).execute()) { if (!response.isSuccessful()) { throw new IllegalArgumentException("è®¾å¤æ§å¶ç½å ³æç»æä»¤ï¼ç¶æç ï¼" + response.code()); } result.put("dispatchMode", "gateway"); result.put("gatewayAcknowledged", true); result.put("gatewayStatus", response.code()); return result; } catch (IllegalArgumentException e) { throw e; } catch (Exception e) { log.error("è®¾å¤æ§å¶ç½å ³è°ç¨å¤±è´¥ï¼deviceId={}, endpoint={}", device.getId(), endpoint, e); throw new IllegalArgumentException("è®¾å¤æ§å¶ç½å ³è¿æ¥å¤±è´¥ï¼è¯·æ£æ¥è®¾å¤ç½ç»"); } } private String trimToNull(String value) { return value == null || value.trim().isEmpty() ? null : value.trim(); } @Override public List<DeviceMonitorVo> alarms() { List<DeviceMonitorVo> all = monitorList(); src/main/resources/application-dev.yml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,222 @@ # è¯é¡¹ç®å¯¼-ä»å¨ç©æµç³»ç»ç¸å ³é ç½® inspur: appId: 1211009035159994368 appSecret: QXdnMjAwMTIwMjYxNTE4MzkwNzMLgG ruoyi: # åç§° name: RuoYi # çæ¬ version: 3.8.9 # çæå¹´ä»½ copyrightYear: 2025 # æä»¶è·¯å¾ 示ä¾ï¼ Windowsé ç½®D:/ruoyi/uploadPathï¼Linuxé ç½® /home/ruoyi/uploadPathï¼ profile: /center-lims/mis/file # è·åipå°åå¼å ³ addressEnabled: false # éªè¯ç ç±»å math æ°åè®¡ç® char å符éªè¯ captchaType: math # å¼åç¯å¢é ç½® server: # æå¡å¨çHTTP端å£ï¼é»è®¤ä¸º8080 port: 8038 servlet: # åºç¨ç访é®è·¯å¾ context-path: / tomcat: # tomcatçURIç¼ç uri-encoding: UTF-8 # è¿æ¥æ°æ»¡åçæéæ°ï¼é»è®¤ä¸º100 accept-count: 1000 threads: # tomcatæå¤§çº¿ç¨æ°ï¼é»è®¤ä¸º200 max: 800 # Tomcatå¯å¨åå§åççº¿ç¨æ°ï¼é»è®¤å¼10 min-spare: 100 # æ¥å¿é ç½® logging: level: com.ruoyi: warn org.springframework: warn minio: endpoint: http://114.132.189.42/ port: 7019 secure: false accessKey: admin secretKey: 12345678 preview-expiry: 24 # é¢è§å°åé»è®¤24å°æ¶ default-bucket: uploadPath # ç¨æ·é ç½® user: password: # å¯ç æå¤§éè¯¯æ¬¡æ° maxRetryCount: 5 # å¯ç é宿¶é´ï¼é»è®¤10åéï¼ lockTime: 10 # Springé ç½® spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://10.136.65.135:3306/wrzsxt-ruoyi-xinlan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: zttZTT123! # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é enabled: false url: username: password: # åå§è¿æ¥æ° initialSize: 5 # æå°è¿æ¥æ± æ°é minIdle: 10 # æå¤§è¿æ¥æ± æ°é maxActive: 20 # é ç½®è·åè¿æ¥çå¾ è¶ æ¶çæ¶é´ maxWait: 60000 # é ç½®è¿æ¥è¶ æ¶æ¶é´ connectTimeout: 30000 # é ç½®ç½ç»è¶ æ¶æ¶é´ socketTimeout: 60000 # é ç½®é´éå¤ä¹ æè¿è¡ä¸æ¬¡æ£æµï¼æ£æµéè¦å ³éç空é²è¿æ¥ï¼å使¯æ¯«ç§ timeBetweenEvictionRunsMillis: 60000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿å°çåçæ¶é´ï¼å使¯æ¯«ç§ minEvictableIdleTimeMillis: 300000 # é ç½®ä¸ä¸ªè¿æ¥å¨æ± 䏿大çåçæ¶é´ï¼å使¯æ¯«ç§ maxEvictableIdleTimeMillis: 900000 # é ç½®æ£æµè¿æ¥æ¯å¦ææ validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置ç½ååï¼ä¸å¡«åå 许ææè®¿é® allow: url-pattern: /druid/* # æ§å¶å°ç®¡çç¨æ·ååå¯ç login-username: ruoyi login-password: 123456 filter: stat: enabled: true # æ ¢SQLè®°å½ log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true # èµæºä¿¡æ¯ messages: # å½é åèµæºæä»¶è·¯å¾ basename: i18n/messages # æä»¶ä¸ä¼ servlet: multipart: # å个æä»¶å¤§å° max-file-size: 1GB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-request-size: 2GB # æå¡æ¨¡å devtools: restart: # çé¨ç½²å¼å ³ enabled: false # redis é ç½® redis: # å°å # host: 127.0.0.1 host: 192.168.197.128 # 端å£ï¼é»è®¤ä¸º6379 port: 6379 # æ°æ®åºç´¢å¼ database: 0 # å¯ç password: zttZTT123! # password: 123456 # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s lettuce: pool: # è¿æ¥æ± ä¸çæå°ç©ºé²è¿æ¥ min-idle: 0 # è¿æ¥æ± ä¸çæå¤§ç©ºé²è¿æ¥ max-idle: 8 # è¿æ¥æ± çæå¤§æ°æ®åºè¿æ¥æ° max-active: 8 # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # tokené ç½® token: # 令çèªå®ä¹æ è¯ header: Authorization # 令çå¯é¥ secret: abcdefghijklmnopqrstuvwxyz # ä»¤çæææï¼é»è®¤30åéï¼ expireTime: 450 # MyBatis Plusé ç½® mybatis-plus: # æç´¢æå®å å«å æ ¹æ®èªå·±çé¡¹ç®æ¥ typeAliasesPackage: com.ruoyi.**.pojo # é ç½®mapperçæ«æï¼æ¾å°ææçmapper.xmlæ å°æä»¶ mapperLocations: classpath*:mapper/**/*Mapper.xml # å è½½å ¨å±çé ç½®æä»¶ configLocation: classpath:mybatis/mybatis-config.xml global-config: enable-sql-runner: true db-config: id-type: auto # PageHelperå页æä»¶ pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swaggeré ç½® swagger: # æ¯å¦å¼å¯swagger enabled: false # 请æ±åç¼ pathMapping: /dev-api # 鲿¢XSSæ»å» xss: # è¿æ»¤å¼å ³ enabled: true # æé¤é¾æ¥ï¼å¤ä¸ªç¨éå·åéï¼ excludes: /system/notice # å¹é 龿¥ urlPatterns: /system/*,/monitor/*,/tool/* # 代ç çæ gen: # ä½è author: ruoyi # é»è®¤çæå è·¯å¾ system éæ¹æèªå·±ç模ååç§° å¦ system monitor tool packageName: com.ruoyi.project.system # èªå¨å»é¤è¡¨åç¼ï¼é»è®¤æ¯true autoRemovePre: false # 表åç¼ï¼çæç±»åä¸ä¼å å«è¡¨åç¼ï¼å¤ä¸ªç¨éå·åéï¼ tablePrefix: sys_ # æ¯å¦å è®¸çææä»¶è¦çå°æ¬å°ï¼èªå®ä¹è·¯å¾ï¼ï¼é»è®¤ä¸å 许 allowOverwrite: false file: temp-dir: /center-lims/mis/file/temp/uploads upload-dir: /center-lims/mis/file/prod/uploads src/main/resources/application-tide.yml
@@ -1,7 +1,7 @@ # è¯å¯¼-ä»å¨ç©æµç³»ç»é¡¹ç®ç¸å ³é ç½® # è¯é¡¹ç®å¯¼-ä»å¨ç©æµç³»ç»ç¸å ³é ç½® inspur: appId: 1216088544800407552 appSecret: TV96MDMwMjIwMjYxNTQyNDg1NDQvSh appId: 1211009035159994368 appSecret: QXdnMjAwMTIwMjYxNTE4MzkwNzMLgG ruoyi: # åç§° name: RuoYi src/main/resources/application.yml
@@ -1,4 +1,5 @@ # Springé ç½® spring: profiles: active: tide # active: tide active: dev