Browse Source

1

pull/1/head
吴远 5 months ago
parent
commit
c7d1f95a64
  1. 45
      dk-common/common-oss/pom.xml
  2. 2
      dk-common/common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java
  3. 34
      dk-common/common-oss/src/main/java/org/dromara/common/oss/enumd/HttpsType.java
  4. 39
      dk-common/common-oss/src/main/java/org/dromara/common/oss/factory/Minio.java
  5. 32
      dk-common/common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java
  6. 52
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java
  7. 24
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFirmwareController.java
  8. 8
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceHmsController.java
  9. 33
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/WorkspaceController.java
  10. 8
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/WorkspaceDTO.java
  11. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceEntity.java
  12. 18
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WorkspaceEntity.java
  13. 2
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWorkspaceService.java
  14. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WorkspaceServiceImpl.java
  15. 9
      dk-modules/sample/src/main/java/org/dromara/sample/storage/service/impl/StorageServiceImpl.java
  16. 9
      pom.xml

45
dk-common/common-oss/pom.xml

@ -16,9 +16,10 @@
</description> </description>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.dromara</groupId> <groupId>org.dromara</groupId>
<artifactId>common-json</artifactId> <artifactId>common-dubbo</artifactId>
</dependency> </dependency>
<dependency> <dependency>
@ -53,6 +54,17 @@
</exclusion> </exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sts</artifactId>
<version>2.28.22</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
<version>2.28.22</version> <!-- 必须与SDK主版本严格一致 -->
</dependency>
<!-- 使用AWS基于 CRT 的 S3 客户端 --> <!-- 使用AWS基于 CRT 的 S3 客户端 -->
<dependency> <dependency>
@ -72,16 +84,9 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.amazonaws</groupId> <groupId>io.minio</groupId>
<artifactId>aws-java-sdk-core</artifactId> <artifactId>minio</artifactId>
<version>1.12.261</version> <version>${minio.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>1.12.261</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
@ -89,6 +94,22 @@
<artifactId>aliyun-sdk-oss</artifactId> <artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun-oss.version}</version> <version>${aliyun-oss.version}</version>
</dependency> </dependency>
</dependencies>
</dependencies>
<repositories>
<repository>
<id>software.amazon.awssdk</id>
<name>software.amazon.awssdk</name>
<url>https://mvnrepository.com/artifact/software.amazon.awssdk/s3/</url>
<releases>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
</project> </project>

2
dk-common/common-oss/src/main/java/org/dromara/common/oss/core/OssClient.java

@ -107,6 +107,7 @@ public class OssClient {
S3Configuration config = S3Configuration.builder().chunkedEncodingEnabled(false) S3Configuration config = S3Configuration.builder().chunkedEncodingEnabled(false)
.pathStyleAccessEnabled(isStyle).build(); .pathStyleAccessEnabled(isStyle).build();
// 创建 预签名 URL 的生成器 实例,用于生成 S3 预签名 URL // 创建 预签名 URL 的生成器 实例,用于生成 S3 预签名 URL
this.presigner = S3Presigner.builder() this.presigner = S3Presigner.builder()
.region(of()) .region(of())
@ -114,7 +115,6 @@ public class OssClient {
.endpointOverride(URI.create(getDomain())) .endpointOverride(URI.create(getDomain()))
.serviceConfiguration(config) .serviceConfiguration(config)
.build(); .build();
// 创建存储桶 // 创建存储桶
createBucket(); createBucket();
} catch (Exception e) { } catch (Exception e) {

34
dk-common/common-oss/src/main/java/org/dromara/common/oss/enumd/HttpsType.java

@ -0,0 +1,34 @@
package org.dromara.common.oss.enumd;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* minio策略配置
*
* @author Lion Li
*/
@Getter
@AllArgsConstructor
public enum HttpsType {
/**
*
*/
N("N"),
/**
*
*/
Y("Y"),
HTTP("http://"),
HTTPS("https://");
/**
* 类型
*/
private final String type;
}

39
dk-common/common-oss/src/main/java/org/dromara/common/oss/factory/Minio.java

@ -1,15 +1,24 @@
package org.dromara.common.oss.factory; package org.dromara.common.oss.factory;
import com.amazonaws.auth.AWSCredentialsProvider; import io.minio.credentials.AssumeRoleProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider; import io.minio.credentials.Credentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder;
import com.amazonaws.services.securitytoken.model.Credentials;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.core.OssClient;
import org.dromara.common.sdk.cloudapi.storage.CredentialsToken; import org.dromara.common.sdk.cloudapi.storage.CredentialsToken;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.sts.StsClient;
import software.amazon.awssdk.services.sts.model.GetFederationTokenRequest;
import software.amazon.awssdk.services.sts.model.GetSessionTokenRequest;
import software.amazon.awssdk.services.sts.model.GetSessionTokenResponse;
import java.net.URI;
import java.security.NoSuchAlgorithmException;
import java.time.Duration;
/** /**
* @auther wuyuan * @auther wuyuan
@ -20,18 +29,16 @@ public class Minio {
public static CredentialsToken getCredentials(OssClient client) { public static CredentialsToken getCredentials(OssClient client) {
try { try {
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(client.getOssProperties().getEndpoint(), client.getOssProperties().getRegion()); AssumeRoleProvider provider = new AssumeRoleProvider(client.getIsHttps()+client.getOssProperties().getEndpoint(), client.getOssProperties().getAccessKey(),
BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(client.getOssProperties().getAccessKey(), client.getOssProperties().getSecretKey()); client.getOssProperties().getSecretKey(), Math.toIntExact(client.getOssProperties().getExpire()),
AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(basicAWSCredentials); null, client.getOssProperties().getRegion(), null, null, null, null);
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.standard() Credentials credential = provider.fetch();
.withEndpointConfiguration(endpointConfiguration) return new CredentialsToken(credential.accessKey(), credential.secretKey(), credential.sessionToken(), client.getOssProperties().getExpire());
.withCredentials(credentialsProvider).build(); } catch (NoSuchAlgorithmException e) {
Credentials credentials = stsClient.getSessionToken().getCredentials();
return new CredentialsToken(credentials.getAccessKeyId(), credentials.getSecretAccessKey(), credentials.getSessionToken(), client.getOssProperties().getExpire());
} catch (Exception e) {
log.debug("Failed to obtain sts."); log.debug("Failed to obtain sts.");
e.printStackTrace(); e.printStackTrace();
} }
return null; return null;
} }
} }

32
dk-common/common-oss/src/main/java/org/dromara/common/oss/factory/OssFactory.java

@ -1,8 +1,8 @@
package org.dromara.common.oss.factory; package org.dromara.common.oss.factory;
import org.apache.dubbo.common.utils.JsonUtils;
import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.json.utils.JsonUtils;
import org.dromara.common.oss.constant.OssConstant; import org.dromara.common.oss.constant.OssConstant;
import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.exception.OssException; import org.dromara.common.oss.exception.OssException;
@ -47,7 +47,7 @@ public class OssFactory {
if (json == null) { if (json == null) {
throw new OssException("系统异常, '" + configKey + "'配置信息不存在!"); throw new OssException("系统异常, '" + configKey + "'配置信息不存在!");
} }
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class); OssProperties properties = JsonUtils.toJavaObject(json, OssProperties.class);
// 使用租户标识避免多个租户相同key实例覆盖 // 使用租户标识避免多个租户相同key实例覆盖
String key = configKey; String key = configKey;
if (StringUtils.isNotBlank(properties.getTenantId())) { if (StringUtils.isNotBlank(properties.getTenantId())) {
@ -71,33 +71,11 @@ public class OssFactory {
return client; return client;
} }
public static synchronized CredentialsToken getCredentials(String configKey) { public static synchronized CredentialsToken getCredentials(OssClient client) {
String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey);
if (json == null) {
throw new OssException("系统异常, '" + configKey + "'配置信息不存在!");
}
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
// 使用租户标识避免多个租户相同key实例覆盖
String key = configKey;
if (StringUtils.isNotBlank(properties.getTenantId())) {
key = properties.getTenantId() + ":" + configKey;
}
OssClient client = CLIENT_CACHE.get(key);
// 客户端不存在或配置不相同则重新构建
if (client == null || !client.checkPropertiesSame(properties)) {
LOCK.lock();
try {
if(OssTypeEnum.ALIYUN.getType().equals(client.getOssProperties().getSThreeType())){ if(OssTypeEnum.ALIYUN.getType().equals(client.getOssProperties().getSThreeType())){
AliyunOss.getCredentials(client); return AliyunOss.getCredentials(client);
}else if(OssTypeEnum.MINIO.getType().equals(client.getOssProperties().getSThreeType())){ }else if(OssTypeEnum.MINIO.getType().equals(client.getOssProperties().getSThreeType())){
Minio.getCredentials(client); return Minio.getCredentials(client);
}
} catch (Exception e) {
log.debug("Failed to obtain sts.");
e.printStackTrace();
} finally {
LOCK.unlock();
}
} }
return null; return null;
} }

52
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceController.java

@ -1,6 +1,11 @@
package org.dromara.sample.manage.controller; package org.dromara.sample.manage.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.v3.oas.annotations.Operation;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.sample.manage.model.dto.DeviceDTO; import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO; import org.dromara.sample.manage.model.dto.DeviceFirmwareUpgradeDTO;
import org.dromara.sample.manage.service.IDeviceService; import org.dromara.sample.manage.service.IDeviceService;
@ -35,22 +40,23 @@ public class DeviceController {
* Get the topology list of all online devices in one workspace. * Get the topology list of all online devices in one workspace.
* @return * @return
*/ */
@GetMapping("/devices") @GetMapping("/{workspace_id}/devices")
public HttpResultResponse<List<DeviceDTO>> getDevices() { @SaCheckPermission("work:spaces:list")
LoginUser loginUser = LoginHelper.getLoginUser(); @Operation(summary = "获取一个工作区中所有在线设备的列表。", description = "获取一个工作区中所有在线设备的列表")
List<DeviceDTO> devicesList = deviceService.getDevicesTopoForWeb(loginUser.getTenantId()); public HttpResultResponse<List<DeviceDTO>> getDevices(@PathVariable("workspace_id") String workspaceId) {
List<DeviceDTO> devicesList = deviceService.getDevicesTopoForWeb(workspaceId);
return HttpResultResponse.success(devicesList); return HttpResultResponse.success(devicesList);
} }
/** /**
* 绑定设备 * 将设备绑定到工作区只能web查看
* After binding the device to the workspace, the device data can only be seen on the web. * After binding the device to the workspace, the device data can only be seen on the web.
* @param device * @param device
* @param deviceSn * @param deviceSn
* @return * @return
*/ */
@PostMapping("/{device_sn}/binding") @PostMapping("/{device_sn}/binding")
@Operation(summary = "获取一个工作区中所有在线设备的列表。", description = "获取一个工作区中所有在线设备的列表")
public HttpResultResponse bindDevice(@RequestBody DeviceDTO device, @PathVariable("device_sn") String deviceSn) { public HttpResultResponse bindDevice(@RequestBody DeviceDTO device, @PathVariable("device_sn") String deviceSn) {
device.setDeviceSn(deviceSn); device.setDeviceSn(deviceSn);
boolean isUpd = deviceService.bindDevice(device); boolean isUpd = deviceService.bindDevice(device);
@ -63,11 +69,12 @@ public class DeviceController {
* @param deviceSn * @param deviceSn
* @return * @return
*/ */
@GetMapping("/devices/{device_sn}") @GetMapping("/{workspace_id}/devices/{device_sn}")
public HttpResultResponse getDevice( @Operation(summary = "根据设备sn获取设备信息。", description = "根据设备sn获取设备信息。")
public HttpResultResponse getDevice(@PathVariable("workspace_id") String workspaceId,
@PathVariable("device_sn") String deviceSn) { @PathVariable("device_sn") String deviceSn) {
Optional<DeviceDTO> deviceOpt = deviceService.getDeviceBySn(deviceSn); Optional<DeviceDTO> deviceOpt = deviceService.getDeviceBySn(deviceSn);
return deviceOpt.isEmpty() ? HttpResultResponse.error("device not found.") : HttpResultResponse.success(deviceOpt.get()); return deviceOpt.isEmpty() ? HttpResultResponse.error("找不到该设备。") : HttpResultResponse.success(deviceOpt.get());
} }
/** /**
@ -77,23 +84,25 @@ public class DeviceController {
* @param pageSize * @param pageSize
* @return * @return
*/ */
@GetMapping("/devices/bound") @Operation(summary = "在工作区中获取绑定设备列表。", description = "在工作区中获取绑定设备列表。")
@GetMapping("/{workspace_id}/devices/bound")
public HttpResultResponse<PaginationData<DeviceDTO>> getBoundDevicesWithDomain( public HttpResultResponse<PaginationData<DeviceDTO>> getBoundDevicesWithDomain(
Integer domain, @PathVariable("workspace_id") String workspaceId,Integer domain,
@RequestParam(defaultValue = "1") Long page, @RequestParam(defaultValue = "1") Long page,
@RequestParam(value = "page_size", defaultValue = "50") Long pageSize) { @RequestParam(value = "page_size", defaultValue = "50") Long pageSize) {
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(loginUser.getTenantId(), page, pageSize, domain); PaginationData<DeviceDTO> devices = deviceService.getBoundDevicesWithDomain(workspaceId, page, pageSize, domain);
return HttpResultResponse.success(devices); return HttpResultResponse.success(devices);
} }
/** /**
* 正在删除设备的绑定状态 * 删除设备的绑定状态
* Removing the binding state of the device. * Removing the binding state of the device.
* @param deviceSn * @param deviceSn
* @return * @return
*/ */
@Operation(summary = "删除设备的绑定状态。", description = "删除设备的绑定状态。")
@DeleteMapping("/{device_sn}/unbinding") @DeleteMapping("/{device_sn}/unbinding")
public HttpResultResponse unbindingDevice(@PathVariable("device_sn") String deviceSn) { public HttpResultResponse unbindingDevice(@PathVariable("device_sn") String deviceSn) {
deviceService.unbindDevice(deviceSn); deviceService.unbindDevice(deviceSn);
@ -108,7 +117,9 @@ public class DeviceController {
* @return * @return
*/ */
@PutMapping("/devices/{device_sn}") @PutMapping("/devices/{device_sn}")
@Operation(summary = "更新设备信息。", description = "更新设备信息。")
public HttpResultResponse updateDevice(@RequestBody DeviceDTO device, public HttpResultResponse updateDevice(@RequestBody DeviceDTO device,
@PathVariable("workspace_id") String workspaceId,
@PathVariable("device_sn") String deviceSn) { @PathVariable("device_sn") String deviceSn) {
device.setDeviceSn(deviceSn); device.setDeviceSn(deviceSn);
boolean isUpd = deviceService.updateDevice(device); boolean isUpd = deviceService.updateDevice(device);
@ -121,11 +132,11 @@ public class DeviceController {
* @param upgradeDTOS * @param upgradeDTOS
* @return * @return
*/ */
@Operation(summary = "设备离线固件升级任务。", description = "设备离线固件升级任务。")
@PostMapping("/devices/ota") @PostMapping("/devices/ota")
public HttpResultResponse createOtaJob( public HttpResultResponse createOtaJob(@PathVariable("workspace_id") String workspaceId,
@RequestBody List<DeviceFirmwareUpgradeDTO> upgradeDTOS) { @RequestBody List<DeviceFirmwareUpgradeDTO> upgradeDTOS) {
LoginUser loginUser = LoginHelper.getLoginUser(); return deviceService.createDeviceOtaJob(workspaceId, upgradeDTOS);
return deviceService.createDeviceOtaJob(loginUser.getTenantId(), upgradeDTOS);
} }
/** /**
@ -135,15 +146,16 @@ public class DeviceController {
* @param param * @param param
* @return * @return
*/ */
@PutMapping("/devices/{device_sn}/property") @Operation(summary = "设置无人机的属性参数。", description = "设置无人机的属性参数。")
public HttpResultResponse devicePropertySet(@PathVariable("device_sn") String dockSn, @PutMapping("/{workspace_id}/devices/{device_sn}/property")
public HttpResultResponse devicePropertySet(@PathVariable("workspace_id") String workspaceId,
@PathVariable("device_sn") String dockSn,
@RequestBody JsonNode param) { @RequestBody JsonNode param) {
LoginUser loginUser = LoginHelper.getLoginUser();
if (param.size() != 1) { if (param.size() != 1) {
return HttpResultResponse.error(CloudSDKErrorEnum.INVALID_PARAMETER); return HttpResultResponse.error(CloudSDKErrorEnum.INVALID_PARAMETER);
} }
int result = deviceService.devicePropertySet(loginUser.getTenantId(), dockSn, param); int result = deviceService.devicePropertySet(workspaceId, dockSn, param);
return PropertySetReplyResultEnum.SUCCESS.getResult() == result ? return PropertySetReplyResultEnum.SUCCESS.getResult() == result ?
HttpResultResponse.success() : HttpResultResponse.error(result, String.valueOf(result)); HttpResultResponse.success() : HttpResultResponse.error(result, String.valueOf(result));
} }

24
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceFirmwareController.java

@ -1,5 +1,6 @@
package org.dromara.sample.manage.controller; package org.dromara.sample.manage.controller;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ -44,6 +45,7 @@ public class DeviceFirmwareController {
* @return * @return
*/ */
@GetMapping("/firmware-release-notes/latest") @GetMapping("/firmware-release-notes/latest")
@Operation(summary = "获取此设备型号的最新固件版本信息。", description = "获取此设备型号的最新固件版本信息。")
public HttpResultResponse<List<DeviceFirmwareNoteDTO>> getLatestFirmwareNote(@RequestParam("device_name") List<String> deviceNames) { public HttpResultResponse<List<DeviceFirmwareNoteDTO>> getLatestFirmwareNote(@RequestParam("device_name") List<String> deviceNames) {
List<DeviceFirmwareNoteDTO> releaseNotes = deviceNames.stream() List<DeviceFirmwareNoteDTO> releaseNotes = deviceNames.stream()
@ -61,11 +63,12 @@ public class DeviceFirmwareController {
* @param param * @param param
* @return * @return
*/ */
@GetMapping("/firmwares") @GetMapping("/{workspace_id}/firmwares")
@Operation(summary = "根据参数查询固件信息。", description = "根据参数查询固件信息。")
public HttpResultResponse<PaginationData<DeviceFirmwareDTO>> getAllFirmwarePagination( public HttpResultResponse<PaginationData<DeviceFirmwareDTO>> getAllFirmwarePagination(
@PathVariable("workspace_id") String workspaceId,
@Valid DeviceFirmwareQueryParam param) { @Valid DeviceFirmwareQueryParam param) {
LoginUser loginUser = LoginHelper.getLoginUser(); PaginationData<DeviceFirmwareDTO> data = service.getAllFirmwarePagination(workspaceId, param);
PaginationData<DeviceFirmwareDTO> data = service.getAllFirmwarePagination(loginUser.getTenantId(), param);
return HttpResultResponse.success(data); return HttpResultResponse.success(data);
} }
@ -77,17 +80,19 @@ public class DeviceFirmwareController {
* @param param * @param param
* @return * @return
*/ */
@PostMapping("/firmwares/file/upload") @Operation(summary = "导入固件文件以进行设备升级。", description = "导入固件文件以进行设备升级。")
@PostMapping("/{workspace_id}/firmwares/file/upload")
public HttpResultResponse importFirmwareFile(HttpServletRequest request, public HttpResultResponse importFirmwareFile(HttpServletRequest request,
@NotNull(message = "No file received.") MultipartFile file, @PathVariable("workspace_id") String workspaceId,
@NotNull(message = "未收到文件。") MultipartFile file,
@Valid DeviceFirmwareUploadParam param) { @Valid DeviceFirmwareUploadParam param) {
if (!file.getOriginalFilename().endsWith(FirmwareFileProperties.FIRMWARE_FILE_SUFFIX)) { if (!file.getOriginalFilename().endsWith(FirmwareFileProperties.FIRMWARE_FILE_SUFFIX)) {
return HttpResultResponse.error("The file format is incorrect."); return HttpResultResponse.error("文件格式不正确。");
} }
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
String creator = loginUser.getUsername(); String creator = loginUser.getUsername();
service.importFirmwareFile(loginUser.getTenantId(), creator, param, file); service.importFirmwareFile(workspaceId, creator, param, file);
return HttpResultResponse.success(); return HttpResultResponse.success();
} }
@ -98,8 +103,9 @@ public class DeviceFirmwareController {
* @param param * @param param
* @return * @return
*/ */
@PutMapping("/firmwares/{firmware_id}") @Operation(summary = "更改固件一致性状态。", description = "更改固件一致性状态。")
public HttpResultResponse changeFirmwareStatus( @PutMapping("/{workspace_id}/firmwares/{firmware_id}")
public HttpResultResponse changeFirmwareStatus(@PathVariable("workspace_id") String workspaceId,
@PathVariable("firmware_id") String firmwareId, @PathVariable("firmware_id") String firmwareId,
@Valid @RequestBody DeviceFirmwareUpdateParam param) { @Valid @RequestBody DeviceFirmwareUpdateParam param) {
service.updateFirmwareInfo(DeviceFirmwareDTO.builder() service.updateFirmwareInfo(DeviceFirmwareDTO.builder()

8
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/DeviceHmsController.java

@ -32,8 +32,8 @@ public class DeviceHmsController {
* @param param * @param param
* @return * @return
*/ */
@GetMapping("/devices/hms") @GetMapping("/{workspace_id}/devices/hms")
public HttpResultResponse<PaginationData<DeviceHmsDTO>> getHmsInformation(DeviceHmsQueryParam param) { public HttpResultResponse<PaginationData<DeviceHmsDTO>> getHmsInformation( @PathVariable("workspace_id") String workspaceId,DeviceHmsQueryParam param) {
PaginationData<DeviceHmsDTO> devices = deviceHmsService.getDeviceHmsByParam(param); PaginationData<DeviceHmsDTO> devices = deviceHmsService.getDeviceHmsByParam(param);
return HttpResultResponse.success(devices); return HttpResultResponse.success(devices);
@ -45,7 +45,7 @@ public class DeviceHmsController {
* @param deviceSn * @param deviceSn
* @return * @return
*/ */
@PutMapping("/devices/hms/{device_sn}") @PutMapping("/{workspace_id}/devices/hms/{device_sn}")
public HttpResultResponse updateReadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) { public HttpResultResponse updateReadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) {
deviceHmsService.updateUnreadHms(deviceSn); deviceHmsService.updateUnreadHms(deviceSn);
return HttpResultResponse.success(); return HttpResultResponse.success();
@ -57,7 +57,7 @@ public class DeviceHmsController {
* @param deviceSn * @param deviceSn
* @return * @return
*/ */
@GetMapping("/devices/hms/{device_sn}") @GetMapping("/{workspace_id}/devices/hms/{device_sn}")
public HttpResultResponse<List<DeviceHmsDTO>> getUnreadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) { public HttpResultResponse<List<DeviceHmsDTO>> getUnreadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) {
PaginationData<DeviceHmsDTO> paginationData = deviceHmsService.getDeviceHmsByParam( PaginationData<DeviceHmsDTO> paginationData = deviceHmsService.getDeviceHmsByParam(
DeviceHmsQueryParam.builder() DeviceHmsQueryParam.builder()

33
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/WorkspaceController.java

@ -1,15 +1,22 @@
package org.dromara.sample.manage.controller; package org.dromara.sample.manage.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import org.dromara.common.core.domain.R;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.common.web.core.BaseController;
import org.dromara.sample.manage.model.dto.WorkspaceDTO; import org.dromara.sample.manage.model.dto.WorkspaceDTO;
import org.dromara.sample.manage.model.entity.WorkspaceEntity;
import org.dromara.sample.manage.service.IWorkspaceService; import org.dromara.sample.manage.service.IWorkspaceService;
import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.LoginUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional; import java.util.Optional;
@ -21,7 +28,7 @@ import java.util.Optional;
*/ */
@RestController @RestController
@RequestMapping("${url.manage.prefix}${url.manage.version}/workspaces") @RequestMapping("${url.manage.prefix}${url.manage.version}/workspaces")
public class WorkspaceController { public class WorkspaceController extends BaseController {
@Autowired @Autowired
private IWorkspaceService workspaceService; private IWorkspaceService workspaceService;
@ -33,10 +40,28 @@ public class WorkspaceController {
* @return * @return
*/ */
@GetMapping("/current") @GetMapping("/current")
@SaCheckPermission("work:spaces:list")
@Operation(summary = "获取当前用户所在工作区的相关信息。", description = "工作区配置无人机所用,绑定到平台需要工作区")
public HttpResultResponse getCurrentWorkspace(HttpServletRequest request) { public HttpResultResponse getCurrentWorkspace(HttpServletRequest request) {
LoginUser loginUser = LoginHelper.getLoginUser(); LoginUser loginUser = LoginHelper.getLoginUser();
String tenantId = loginUser.getTenantId(); String tenantId = loginUser.getTenantId();
Optional<WorkspaceDTO> workspaceOpt = workspaceService.getWorkspaceByTenantId(tenantId); Optional<WorkspaceDTO> workspaceOpt = workspaceService.getWorkspaceByTenantId(tenantId);
return workspaceOpt.isEmpty() ? HttpResultResponse.error() : HttpResultResponse.success(workspaceOpt.get()); return workspaceOpt.isEmpty() ? HttpResultResponse.error() : HttpResultResponse.success(workspaceOpt.get());
} }
/**
* 新增工作区
* Gets information about the workspace that the current user is in.
* @param request
* @return
*/
@PostMapping("/add")
@SaCheckPermission("work:spaces:add")
@Operation(summary = "新增工作区。", description = "新增工作区主要是组织号",
parameters = {
@Parameter(name = "workspaceDTO", description = "workspaceDTO"),
})
public HttpResultResponse addCurrentWorkspace(HttpServletRequest request, @Validated @RequestBody WorkspaceDTO workspaceDTO) {
return workspaceService.insertCurrentWorkspace(workspaceDTO) > 0 ? HttpResultResponse.success() : HttpResultResponse.error();
}
} }

8
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/dto/WorkspaceDTO.java

@ -1,5 +1,7 @@
package org.dromara.sample.manage.model.dto; package org.dromara.sample.manage.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -18,13 +20,19 @@ public class WorkspaceDTO {
private Integer id; private Integer id;
@Pattern(regexp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
@Schema(description = "workspaceId,设备区域标识id", format = "uuid")
private String workspaceId; private String workspaceId;
@Schema(description = "workspaceName,工作区标识id")
private String workspaceName; private String workspaceName;
@Schema(description = "workspaceName,工作区标识id")
private String workspaceDesc; private String workspaceDesc;
@Schema(description = "platformName,工作区的平台名称")
private String platformName; private String platformName;
@Schema(description = "bindCode,设备编码")
private String bindCode; private String bindCode;
} }

9
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/DeviceEntity.java

@ -7,6 +7,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* The entity class of the device * The entity class of the device
@ -52,11 +53,11 @@ public class DeviceEntity implements Serializable {
@TableField(value = "child_sn") @TableField(value = "child_sn")
private String childSn; private String childSn;
@TableField(value = "create_time", fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Long createTime; private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateTime; private Date updateTime;
@TableField(value = "device_desc") @TableField(value = "device_desc")
private String deviceDesc; private String deviceDesc;

18
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WorkspaceEntity.java

@ -1,36 +1,40 @@
package org.dromara.sample.manage.model.entity; package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.tenant.core.TenantEntity;
import java.io.Serializable; import java.io.Serializable;
@TableName(value = "manage_workspace") @TableName(value = "manage_workspace")
@Data @Data
public class WorkspaceEntity implements Serializable { public class WorkspaceEntity extends TenantEntity implements Serializable {
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private Integer id; private Integer id;
@TableField(value = "workspace_id") @TableField(value = "workspace_id")
@Pattern(regexp = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
@Schema(description = "workspaceId,设备区域标识id", format = "uuid")
private String workspaceId; private String workspaceId;
@TableField(value = "workspace_name") @TableField(value = "workspace_name")
@Schema(description = "workspaceName,工作区标识id")
private String workspaceName; private String workspaceName;
@TableField(value = "workspace_desc") @TableField(value = "workspace_desc")
@Schema(description = "workspaceDesc,工作区描述")
private String workspaceDesc; private String workspaceDesc;
@TableField(value = "platform_name") @TableField(value = "platform_name")
@Schema(description = "platformName,工作区的平台名称")
private String platformName; private String platformName;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Long createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Long updateTime;
@TableField(value = "bind_code") @TableField(value = "bind_code")
@Schema(description = "bindCode,设备编码")
private String bindCode; private String bindCode;

2
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IWorkspaceService.java

@ -23,4 +23,6 @@ public interface IWorkspaceService {
*/ */
Optional<WorkspaceDTO> getWorkspaceNameByBindCode(String bindCode); Optional<WorkspaceDTO> getWorkspaceNameByBindCode(String bindCode);
int insertCurrentWorkspace(WorkspaceDTO workspaceDTO);
} }

9
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/WorkspaceServiceImpl.java

@ -1,6 +1,7 @@
package org.dromara.sample.manage.service.impl; package org.dromara.sample.manage.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.sample.manage.mapper.IWorkspaceMapper; import org.dromara.sample.manage.mapper.IWorkspaceMapper;
import org.dromara.sample.manage.model.dto.WorkspaceDTO; import org.dromara.sample.manage.model.dto.WorkspaceDTO;
import org.dromara.sample.manage.model.entity.WorkspaceEntity; import org.dromara.sample.manage.model.entity.WorkspaceEntity;
@ -35,7 +36,7 @@ public class WorkspaceServiceImpl implements IWorkspaceService {
return Optional.ofNullable(entityConvertToDto( return Optional.ofNullable(entityConvertToDto(
mapper.selectOne( mapper.selectOne(
new LambdaQueryWrapper<WorkspaceEntity>() new LambdaQueryWrapper<WorkspaceEntity>()
.eq(WorkspaceEntity::getWorkspaceId, tenantId)))); .eq(WorkspaceEntity::getTenantId, tenantId))));
} }
@Override @Override
@ -44,6 +45,12 @@ public class WorkspaceServiceImpl implements IWorkspaceService {
mapper.selectOne(new LambdaQueryWrapper<WorkspaceEntity>().eq(WorkspaceEntity::getBindCode, bindCode)))); mapper.selectOne(new LambdaQueryWrapper<WorkspaceEntity>().eq(WorkspaceEntity::getBindCode, bindCode))));
} }
@Override
public int insertCurrentWorkspace(WorkspaceDTO workspaceDTO) {
WorkspaceEntity workspaceEntity = MapstructUtils.convert(workspaceDTO, WorkspaceEntity.class);
return mapper.insert(workspaceEntity);
}
/** /**
* Convert database entity objects into workspace data transfer object. * Convert database entity objects into workspace data transfer object.
* @param entity * @param entity

9
dk-modules/sample/src/main/java/org/dromara/sample/storage/service/impl/StorageServiceImpl.java

@ -9,6 +9,7 @@ import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder
import com.amazonaws.services.securitytoken.model.Credentials; import com.amazonaws.services.securitytoken.model.Credentials;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.enumd.HttpsType;
import org.dromara.common.oss.factory.OssFactory; import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.sdk.cloudapi.media.StorageConfigGet; import org.dromara.common.sdk.cloudapi.media.StorageConfigGet;
import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService; import org.dromara.common.sdk.cloudapi.media.api.AbstractMediaService;
@ -35,11 +36,11 @@ public class StorageServiceImpl extends AbstractMediaService implements IStorage
@Override @Override
public StsCredentialsResponse getSTSCredentials() { public StsCredentialsResponse getSTSCredentials() {
OssClient ossClient = OssFactory.instance("media_file"); OssClient ossClient = OssFactory.instance("mediafile");
return new StsCredentialsResponse() return new StsCredentialsResponse()
.setEndpoint(ossClient.getOssProperties().getEndpoint()) .setEndpoint(ossClient.getIsHttps()+ossClient.getOssProperties().getEndpoint())
.setBucket("media_file") .setBucket("mediafile")
.setCredentials(OssFactory.getCredentials("media_file")) .setCredentials(OssFactory.getCredentials(ossClient))
.setProvider(OssTypeEnum.fromType(ossClient.getOssProperties().getSThreeType())) .setProvider(OssTypeEnum.fromType(ossClient.getOssProperties().getSThreeType()))
.setObjectKeyPrefix(ossClient.getOssProperties().getPrefix()) .setObjectKeyPrefix(ossClient.getOssProperties().getPrefix())
.setRegion(ossClient.getOssProperties().getRegion()); .setRegion(ossClient.getOssProperties().getRegion());

9
pom.xml

@ -51,6 +51,7 @@
<!-- OSS 配置 --> <!-- OSS 配置 -->
<aws.sdk.version>2.28.22</aws.sdk.version> <aws.sdk.version>2.28.22</aws.sdk.version>
<aws.crt.version>0.31.3</aws.crt.version> <aws.crt.version>0.31.3</aws.crt.version>
<minio.version>8.3.7</minio.version>
<!-- SMS 配置 --> <!-- SMS 配置 -->
<sms4j.version>3.3.3</sms4j.version> <sms4j.version>3.3.3</sms4j.version>
@ -82,12 +83,12 @@
<properties> <properties>
<!-- 环境标识,需要与配置文件的名称相对应 --> <!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active> <profiles.active>dev</profiles.active>
<nacos.server>114.235.183.147:8848</nacos.server> <nacos.server>127.0.0.1:8848</nacos.server>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group> <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group> <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username> <nacos.username>nacos</nacos.username>
<nacos.password>nacos</nacos.password> <nacos.password>nacos</nacos.password>
<logstash.address>114.235.183.147:4560</logstash.address> <logstash.address>127.0.0.1:4560</logstash.address>
</properties> </properties>
<activation> <activation>
<!-- 默认环境 --> <!-- 默认环境 -->
@ -98,12 +99,12 @@
<id>prod</id> <id>prod</id>
<properties> <properties>
<profiles.active>prod</profiles.active> <profiles.active>prod</profiles.active>
<nacos.server>114.235.183.147:8848</nacos.server> <nacos.server>127.0.0.1:8848</nacos.server>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group> <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group> <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username> <nacos.username>nacos</nacos.username>
<nacos.password>nacos</nacos.password> <nacos.password>nacos</nacos.password>
<logstash.address>114.235.183.147:4560</logstash.address> <logstash.address>127.0.0.1:4560</logstash.address>
</properties> </properties>
</profile> </profile>
</profiles> </profiles>

Loading…
Cancel
Save