Browse Source

add swagger support

荭琪枫 2 years ago
parent
commit
3ec18b6270

+ 15 - 0
iot-standalone/pom.xml

@@ -181,6 +181,21 @@
             <artifactId>iot-data-cache</artifactId>
             <artifactId>iot-data-cache</artifactId>
         </dependency>
         </dependency>
 
 
+        <!--springfox swagger官方Starter-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-boot-starter</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
+        </dependency>
+
+
+
     </dependencies>
     </dependencies>
 
 
     <build>
     <build>

+ 15 - 7
iot-standalone/src/main/java/cc/iotkit/manager/config/SaTokenConfigure.java

@@ -18,12 +18,26 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 
+import java.util.Arrays;
+import java.util.List;
+
 @Slf4j
 @Slf4j
 @Configuration
 @Configuration
 public class SaTokenConfigure implements WebMvcConfigurer {
 public class SaTokenConfigure implements WebMvcConfigurer {
 
 
     @Override
     @Override
     public void addInterceptors(InterceptorRegistry registry) {
     public void addInterceptors(InterceptorRegistry registry) {
+        List<String> urls = Arrays.asList("/favicon.ico",
+                "h2",
+                "/error",
+                "*.png",
+                "*.js",
+                "/oauth2/**",
+                "*.html",
+                "/favicon.ico",
+                "swagger-resources/**",
+                "/webjars/**", "/v2/**", "/doc.html", "**/swagger-ui.html", "/swagger-ui.html/**");
+
         // 注册注解拦截器
         // 注册注解拦截器
         registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
         registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
         // 注册路由拦截器,自定义认证规则
         // 注册路由拦截器,自定义认证规则
@@ -81,13 +95,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
                     ).check(c -> StpUtil.checkPermission("write"));
                     ).check(c -> StpUtil.checkPermission("write"));
 
 
         })).addPathPatterns("/**")
         })).addPathPatterns("/**")
-                .excludePathPatterns(
-                        "/h2",
-                        "/*.png",
-                        "/oauth2/**", "/*.html",
-                        "/favicon.ico", "/v2/api-docs",
-                        "/webjars/**", "/swagger-resources/**",
-                        "/*.js");
+                .excludePathPatterns(urls);
     }
     }
 
 
 }
 }

+ 46 - 0
iot-standalone/src/main/java/cc/iotkit/manager/config/SwaggerConfig.java

@@ -0,0 +1,46 @@
+package cc.iotkit.manager.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import io.swagger.annotations.Api;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * @Author: 石恒
+ * @Date: 2023/5/4 20:12
+ * @Description:
+ */
+@Configuration
+@EnableSwagger2
+@EnableKnife4j
+public class SwaggerConfig {
+
+    @Bean
+    public Docket createApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    @Bean
+    public ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("奇特物联")
+                .description("奇特物联")
+                .version("1.0")
+                .build();
+    }
+
+}
+
+

+ 39 - 3
iot-standalone/src/main/java/cc/iotkit/manager/controller/DeviceController.java

@@ -36,6 +36,10 @@ import cc.iotkit.model.product.ThingModel;
 import cc.iotkit.temporal.IDevicePropertyData;
 import cc.iotkit.temporal.IDevicePropertyData;
 import cc.iotkit.temporal.IThingModelMessageData;
 import cc.iotkit.temporal.IThingModelMessageData;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,9 +48,11 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.context.request.async.DeferredResult;
 import org.springframework.web.context.request.async.DeferredResult;
 
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
+@Api(tags = {"设备"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/device")
 @RequestMapping("/device")
@@ -79,6 +85,12 @@ public class DeviceController {
     @Autowired
     @Autowired
     private IDeviceConfigData deviceConfigData;
     private IDeviceConfigData deviceConfigData;
 
 
+    @ApiOperation(value = "服务调用", notes = "服务调用", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "service", value = "服务", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "args", value = "参数", dataTypeClass = Map.class),
+    })
     @PostMapping(Constants.API_DEVICE.INVOKE_SERVICE)
     @PostMapping(Constants.API_DEVICE.INVOKE_SERVICE)
     public InvokeResult invokeService(@PathVariable("deviceId") String deviceId,
     public InvokeResult invokeService(@PathVariable("deviceId") String deviceId,
                                       @PathVariable("service") String service,
                                       @PathVariable("service") String service,
@@ -89,20 +101,36 @@ public class DeviceController {
         return new InvokeResult(deviceService.invokeService(deviceId, service, args));
         return new InvokeResult(deviceService.invokeService(deviceId, service, args));
     }
     }
 
 
+    @ApiOperation(value = "属性获取", notes = "属性获取", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "propertyNames", value = "属性列表", dataTypeClass = ArrayList.class)
+    })
     @PostMapping(Constants.API_DEVICE.INVOKE_SERVICE_PROPERTY_GET)
     @PostMapping(Constants.API_DEVICE.INVOKE_SERVICE_PROPERTY_GET)
     public InvokeResult invokeServicePropertySet(@PathVariable("deviceId") String deviceId,
     public InvokeResult invokeServicePropertySet(@PathVariable("deviceId") String deviceId,
-                                      @RequestBody List<String> propertyNames) {
+                                                 @RequestBody List<String> propertyNames) {
         if (StringUtils.isBlank(deviceId)) {
         if (StringUtils.isBlank(deviceId)) {
             throw new BizException(ErrCode.PARAMS_EXCEPTION);
             throw new BizException(ErrCode.PARAMS_EXCEPTION);
         }
         }
         return new InvokeResult(deviceService.getProperty(deviceId, propertyNames, true));
         return new InvokeResult(deviceService.getProperty(deviceId, propertyNames, true));
     }
     }
+
+    @ApiOperation(value = "属性设置", notes = "属性设置", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "args", value = "参数", dataTypeClass = Map.class)
+    })
     @PostMapping(Constants.API_DEVICE.SET_PROPERTIES)
     @PostMapping(Constants.API_DEVICE.SET_PROPERTIES)
     public InvokeResult setProperty(@PathVariable("deviceId") String deviceId,
     public InvokeResult setProperty(@PathVariable("deviceId") String deviceId,
                                     @RequestBody Map<String, Object> args) {
                                     @RequestBody Map<String, Object> args) {
         return new InvokeResult(deviceService.setProperty(deviceId, args));
         return new InvokeResult(deviceService.setProperty(deviceId, args));
     }
     }
 
 
+    @ApiOperation(value = "设备列表", notes = "设备列表", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "size", value = "长度", dataTypeClass = Integer.class, paramType = "path"),
+            @ApiImplicitParam(name = "page", value = "页数", dataTypeClass = Integer.class, paramType = "path")
+    })
     @PostMapping("/list/{size}/{page}")
     @PostMapping("/list/{size}/{page}")
     public Paging<DeviceInfo> getDevices(
     public Paging<DeviceInfo> getDevices(
             @PathVariable("size") int size,
             @PathVariable("size") int size,
@@ -129,6 +157,12 @@ public class DeviceController {
                 state, keyword, page, size);
                 state, keyword, page, size);
     }
     }
 
 
+    @ApiOperation(value = "创建设备", notes = "创建设备", httpMethod = "POST")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "productKey", value = "产品key", dataTypeClass = String.class, paramType = "form"),
+            @ApiImplicitParam(name = "deviceName", value = "设备名称", dataTypeClass = String.class, paramType = "form"),
+            @ApiImplicitParam(name = "parentId", value = "父设备ID", dataTypeClass = String.class, paramType = "form")
+    })
     @PostMapping("/create")
     @PostMapping("/create")
     public void createDevice(String productKey, String deviceName, String parentId) {
     public void createDevice(String productKey, String deviceName, String parentId) {
         Product product = productData.findById(productKey);
         Product product = productData.findById(productKey);
@@ -153,12 +187,14 @@ public class DeviceController {
         device.setSecret(secret.toString());
         device.setSecret(secret.toString());
         device.setState(new DeviceInfo.State(false, null, null));
         device.setState(new DeviceInfo.State(false, null, null));
         device.setCreateAt(System.currentTimeMillis());
         device.setCreateAt(System.currentTimeMillis());
-        if(StringUtils.isNotBlank(parentId)){
+        if (StringUtils.isNotBlank(parentId)) {
             device.setParentId(parentId);
             device.setParentId(parentId);
         }
         }
         deviceInfoData.save(device);
         deviceInfoData.save(device);
     }
     }
 
 
+    @ApiOperation(value = "获取子设备", notes = "获取子设备", httpMethod = "GET")
+    @ApiImplicitParam(name = "deviceId", value = "设备ID", dataTypeClass = String.class, paramType = "form")
     @GetMapping("/{deviceId}/children")
     @GetMapping("/{deviceId}/children")
     public List<DeviceInfo> getChildren(@PathVariable("deviceId") String deviceId) {
     public List<DeviceInfo> getChildren(@PathVariable("deviceId") String deviceId) {
         DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId);
         DeviceInfo deviceInfo = deviceInfoData.findByDeviceId(deviceId);
@@ -174,7 +210,7 @@ public class DeviceController {
     public List<Map<String, Object>> getParentDevices() {
     public List<Map<String, Object>> getParentDevices() {
         String uid = "";
         String uid = "";
         if (!AuthUtil.isAdmin()) {
         if (!AuthUtil.isAdmin()) {
-             uid = AuthUtil.getUserId();
+            uid = AuthUtil.getUserId();
         }
         }
         return deviceInfoData.findByProductNodeType(uid);
         return deviceInfoData.findByProductNodeType(uid);
     }
     }

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/ProductController.java

@@ -29,6 +29,7 @@ import cn.dev33.satoken.annotation.SaCheckRole;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSS;
 import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.model.PutObjectResult;
 import com.aliyun.oss.model.PutObjectResult;
+import io.swagger.annotations.Api;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +40,7 @@ import org.springframework.web.multipart.MultipartFile;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
+@Api(tags = {"产品"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/product")
 @RequestMapping("/product")

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/ProtocolController.java

@@ -22,6 +22,7 @@ import cc.iotkit.model.Paging;
 import cc.iotkit.model.protocol.ProtocolComponent;
 import cc.iotkit.model.protocol.ProtocolComponent;
 import cc.iotkit.model.protocol.ProtocolConverter;
 import cc.iotkit.model.protocol.ProtocolConverter;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FileUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +36,7 @@ import java.nio.file.*;
 import java.util.Objects;
 import java.util.Objects;
 import java.util.UUID;
 import java.util.UUID;
 
 
+@Api(tags = {"协议"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/protocol")
 @RequestMapping("/protocol")

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/RuleEngineController.java

@@ -25,6 +25,7 @@ import cc.iotkit.ruleengine.task.TaskManager;
 import cc.iotkit.temporal.IRuleLogData;
 import cc.iotkit.temporal.IRuleLogData;
 import cc.iotkit.temporal.ITaskLogData;
 import cc.iotkit.temporal.ITaskLogData;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.quartz.SchedulerException;
 import org.quartz.SchedulerException;
@@ -34,6 +35,7 @@ import org.springframework.web.bind.annotation.*;
 import java.util.List;
 import java.util.List;
 import java.util.UUID;
 import java.util.UUID;
 
 
+@Api(tags = {"规则引擎"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/rule_engine")
 @RequestMapping("/rule_engine")

+ 2 - 1
iot-standalone/src/main/java/cc/iotkit/manager/controller/SpaceController.java

@@ -17,13 +17,14 @@ import cc.iotkit.manager.service.DataOwnerService;
 import cc.iotkit.model.space.Home;
 import cc.iotkit.model.space.Home;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import java.util.List;
 import java.util.List;
 
 
-
+@Api(tags = {"空间"})
 @RestController
 @RestController
 @RequestMapping("/space")
 @RequestMapping("/space")
 public class SpaceController {
 public class SpaceController {

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/SpaceDeviceController.java

@@ -24,6 +24,7 @@ import cc.iotkit.model.space.Home;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.model.space.SpaceDevice;
 import cc.iotkit.model.space.SpaceDevice;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -35,6 +36,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 
 
+@Api(tags = {"空间设备"})
 @RestController
 @RestController
 @RequestMapping("/space")
 @RequestMapping("/space")
 public class SpaceDeviceController {
 public class SpaceDeviceController {

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/StatsController.java

@@ -15,6 +15,7 @@ import cc.iotkit.data.IProductData;
 import cc.iotkit.manager.model.stats.MainStats;
 import cc.iotkit.manager.model.stats.MainStats;
 import cc.iotkit.temporal.IThingModelMessageData;
 import cc.iotkit.temporal.IThingModelMessageData;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -22,6 +23,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+@Api(tags = {"状态"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/stats")
 @RequestMapping("/stats")

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/UserInfoController.java

@@ -22,6 +22,7 @@ import cc.iotkit.model.space.Home;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.model.space.Space;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
 import cn.dev33.satoken.annotation.SaCheckRole;
 import cn.dev33.satoken.annotation.SaCheckRole;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -29,6 +30,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.UUID;
 import java.util.UUID;
 
 
+@Api(tags = {"用户"})
 @RestController
 @RestController
 @RequestMapping("/user")
 @RequestMapping("/user")
 public class UserInfoController {
 public class UserInfoController {

+ 2 - 0
iot-standalone/src/main/java/cc/iotkit/manager/controller/VirtualDeviceController.java

@@ -20,12 +20,14 @@ import cc.iotkit.model.device.VirtualDeviceLog;
 import cc.iotkit.temporal.IVirtualDeviceLogData;
 import cc.iotkit.temporal.IVirtualDeviceLogData;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.utils.AuthUtil;
 import cc.iotkit.virtualdevice.VirtualManager;
 import cc.iotkit.virtualdevice.VirtualManager;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import java.util.List;
 import java.util.List;
 
 
+@Api(tags = {"虚拟设备"})
 @Slf4j
 @Slf4j
 @RestController
 @RestController
 @RequestMapping("/virtual_device")
 @RequestMapping("/virtual_device")