From ce78b4e3fd2c2fb944bfc11f6777e31058ecbf11 Mon Sep 17 00:00:00 2001 From: liyongbin <2954265606@qq.com> Date: Tue, 26 Dec 2023 18:51:47 +0800 Subject: [PATCH 1/5] =?UTF-8?q?api=E6=9C=80=E6=96=B0=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/srt/DataServiceApplication.java | 40 +++ .../java/net/srt/constants/ApiConstants.java | 8 + .../java/net/srt/constants/ApiController.java | 53 ++++ .../java/net/srt/constants/ApiGroupType.java | 19 ++ .../srt/controller/ApiConfigController.java | 119 ++++++++ .../srt/controller/ApiGroupController.java | 69 +++++ .../DataServiceApiAuthController.java | 10 + .../DataServiceApiLogController.java | 43 +++ .../net/srt/convert/ApiConfigConvert.java | 30 ++ .../java/net/srt/convert/ApiGroupConvert.java | 26 ++ .../convert/DataServiceApiAuthConvert.java | 10 + .../srt/convert/DataServiceApiLogConvert.java | 24 ++ .../main/java/net/srt/dao/ApiConfigDao.java | 15 + .../main/java/net/srt/dao/ApiGroupDao.java | 9 + .../net/srt/dao/DataServiceApiAuthDao.java | 10 + .../net/srt/dao/DataServiceApiLogDao.java | 15 + .../main/java/net/srt/dto/ApiConfigDto.java | 48 ++++ .../src/main/java/net/srt/dto/AppToken.java | 17 ++ .../src/main/java/net/srt/dto/SqlDto.java | 15 + .../java/net/srt/entity/ApiConfigEntity.java | 38 +++ .../java/net/srt/entity/ApiGroupEntity.java | 17 ++ .../srt/entity/DataServiceApiAuthEntity.java | 69 +++++ .../srt/entity/DataServiceApiLogEntity.java | 61 ++++ .../main/java/net/srt/handler/ApiHandler.java | 27 ++ .../java/net/srt/handler/ApiRegistration.java | 21 ++ .../srt/handler/MappingRequestHandler.java | 9 + .../handler/MappingRequestHandlerExample.java | 25 ++ .../java/net/srt/query/ApiConfigQuery.java | 21 ++ .../net/srt/query/DataServiceApiLogQuery.java | 20 ++ .../net/srt/service/ApiConfigService.java | 40 +++ .../java/net/srt/service/ApiGroupService.java | 18 ++ .../service/DataServiceApiAuthService.java | 10 + .../srt/service/DataServiceApiLogService.java | 21 ++ .../service/impl/ApiConfigServiceImpl.java | 260 ++++++++++++++++++ .../srt/service/impl/ApiGroupServiceImpl.java | 95 +++++++ .../impl/DataServiceApiAuthServiceImpl.java | 10 + .../impl/DataServiceApiLogServiceImpl.java | 51 ++++ .../src/main/java/net/srt/vo/ApiConfigVo.java | 55 ++++ .../src/main/java/net/srt/vo/ApiGroupVo.java | 25 ++ .../java/net/srt/vo/DataServiceApiLogVo.java | 72 +++++ .../main/java/net/srt/vo/ServiceApiLogVo.java | 73 +++++ .../main/java/net/srt/vo/ServiceAppVo.java | 70 +++++ .../main/resources/mapper/ApiConfigDao.xml | 28 ++ 43 files changed, 1716 insertions(+) create mode 100644 srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiAuthController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java create mode 100644 srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml diff --git a/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java b/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java new file mode 100644 index 0000000..f8b6551 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/DataServiceApplication.java @@ -0,0 +1,40 @@ +package net.srt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients +@EnableDiscoveryClient +@SpringBootApplication +public class DataServiceApplication { + public static void main(String[] args) { + SpringApplication.run(DataServiceApplication.class, args); + System.out.println("\n" + + "/**\n" + + " * _ooOoo_\n" + + " * o8888888o\n" + + " * 88\" . \"88\n" + + " * (| -_- |)\n" + + " * O\\ = /O\n" + + " * ____/`---'\\____\n" + + " * . ' \\\\| |// `.\n" + + " * / \\\\||| : |||// \\\n" + + " * / _||||| -:- |||||- \\\n" + + " * | | \\\\\\ - /// | |\n" + + " * | \\_| ''\\---/'' | |\n" + + " * \\ .-\\__ `-` ___/-. /\n" + + " * ___`. .' /--.--\\ `. . __\n" + + " * .\"\" '< `.___\\_<|>_/___.' >'\"\".\n" + + " * | | : `- \\`.;`\\ _ /`;.`/ - ` : | |\n" + + " * \\ \\ `-. \\_ __\\ /__ _/ .-` / /\n" + + " * ======`-.____`-.___\\_____/___.-`____.-'======\n" + + " * `=---='\n" + + " *\n" + + " * .............................................\n" + + " * 佛祖保佑 代码 启动 永无BUG\n" + + " */\n" + + "————————代码——启动————————"); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java new file mode 100644 index 0000000..6800b30 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java @@ -0,0 +1,8 @@ +package net.srt.constants; + +import lombok.Data; + +@Data +public class ApiConstants { + public static final String API_PREFIX = "/api/v1"; // 例如,这里定义了一个API的前缀 +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java new file mode 100644 index 0000000..20e6083 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java @@ -0,0 +1,53 @@ +package net.srt.constants; + +import net.srt.dao.ApiConfigDao; +import net.srt.entity.ApiConfigEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.http.HttpStatus; +import org.springframework.web.server.ResponseStatusException; + +@Controller +@RequestMapping("/api") +public class ApiController { + + private boolean isOnline = true; + + @GetMapping("/status") + public ResponseEntity getStatus() { + String status = isOnline ? "online" : "offline"; + return ResponseEntity.ok("API status: " + status); + } + + @GetMapping("/resource/{id}") + public ResponseEntity getResource(@PathVariable Long id) { + if (!isOnline) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + + // 处理获取资源的逻辑... + + String resource = ""; // 假设这里是获取资源的代码 + + if (resource != null) { + return ResponseEntity.ok("Resource: " + resource); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + + @GetMapping("/offline") + public ResponseEntity offline() { + isOnline = false; + return ResponseEntity.ok("API is now offline"); + } + + @GetMapping("/online") + public ResponseEntity online() { + isOnline = true; + return ResponseEntity.ok("API is now online"); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java new file mode 100644 index 0000000..7ab6c34 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java @@ -0,0 +1,19 @@ +package net.srt.constants; + +public enum ApiGroupType { + FOLDER(1,"数据库"), + API(2,"数据库"); + private final Integer value; + private final String longValue; + + ApiGroupType(Integer value, String longValue) { + this.value = value; + this.longValue = longValue; + } + public Integer getValue() { + return value; + } + public String getLongValue() { + return longValue; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java new file mode 100644 index 0000000..6d4b01e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -0,0 +1,119 @@ +package net.srt.controller; +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiConfigConvert; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/api-config") +@AllArgsConstructor +public class ApiConfigController { + private final ApiConfigService apiConfigService; + + @GetMapping("page") + @Operation(summary = "分页") + @PreAuthorize("hasAuthority('data-service:api-config:page')") + public Result> page(@Valid ApiConfigQuery query) { + PageResult page = apiConfigService.page(query); + + return Result.ok(page); + } + @GetMapping("page-resource") + @Operation(summary = "根据resourceId分页获取") + public Result> pageResource(@Valid ApiConfigQuery query){ + PageResult page = apiConfigService.pageResource(query); + + return Result.ok(page); + } + +// @GetMapping("{id}") +// @Operation(summary = "信息") +// public ResponseEntity get(@PathVariable("id") Long id) { +// ApiConfigEntity entity = apiConfigService.getById(id); +// if (entity != null && entity.getStatus() == 1) { +// return ResponseEntity.ok(ApiConfigConvert.INSTANCE.convert(entity)); +// } else { +// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found"); +// } +// } + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAnyAuthority('data-service:api-config:info')") + public Result get(@PathVariable("id") Long id){ + ApiConfigEntity entity=apiConfigService.getById(id); + return Result.ok(ApiConfigConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAnyAuthority('data-service:api-config:save')") + public Result save(@RequestBody ApiConfigVo vo) { + apiConfigService.save(vo); + return Result.ok(); + } + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAnyAuthority('data-service:api-config:update')") + public Result update(@RequestBody ApiConfigVo vo){ + apiConfigService.update(vo); + return Result.ok(); + } + @DeleteMapping + @Operation(summary = "删除") + @PreAuthorize("hasAnyAuthority('data-service:api-config:delete')") + public Result delete(@RequestBody List idList){ + apiConfigService.delete(idList); + return Result.ok(); + } + @GetMapping("getIpPort") + public Result getIpPort() { + return Result.ok(apiConfigService.getIpPort()); + } + @Operation(summary = "获取服务的ip和端口号") + @GetMapping("/ip-port") + public Result ipPort() { + return Result.ok(apiConfigService.ipPort()); + } + @Operation(summary = "上线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:online')") + @PutMapping("/{id}/online") + public Result online(@PathVariable Long id) { + apiConfigService.online(id); + return Result.ok(); + } + @Operation(summary = "下线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:offline')") + @PutMapping("/{id}/offline") + public Result offline(@PathVariable Long id){ + apiConfigService.offline(id); + return Result.ok(); + } + + @Operation(summary = "执行sql") + @PostMapping("/sql/execute") + public Result sqlExecute(@RequestBody SqlDto dto) { + return Result.ok(apiConfigService.sqlExecute(dto)); + } + + @Operation(summary = "导出 api 文档") + @PostMapping(value = "/export-docs") + public void exportDocs(@RequestBody List ids, HttpServletResponse response) { + apiConfigService.exportDocs(ids, response); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java new file mode 100644 index 0000000..8a67958 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java @@ -0,0 +1,69 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiGroupConvert; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.ApiGroupVo; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@RestController +@RequestMapping("/api-group") +@AllArgsConstructor +public class ApiGroupController { + private final ApiGroupService apiGroupService; + @GetMapping("api-group") + @Operation(summary = "查询文件分组树") + public Result> listTree() { + return Result.ok(apiGroupService.listTree()); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAuthority('data-service:api-group:info')") + public Result get(@PathVariable("id") Long id){ + ApiGroupEntity entity = apiGroupService.getById(id); + + return Result.ok(ApiGroupConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAuthority('data-service:api-group:save')") + public Result save(@RequestBody ApiGroupVo vo) { + apiGroupService.save(vo); + return Result.ok(); + } + + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAuthority('data-service:api-group:update')") + public Result update(@RequestBody @Valid ApiGroupVo vo) { + apiGroupService.update(vo); + return Result.ok(); + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除") + @PreAuthorize("hasAuthority('data-service:api-group:delete')") + public Result delete(@PathVariable Long id) { + apiGroupService.delete(id); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiAuthController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiAuthController.java new file mode 100644 index 0000000..0feaeae --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiAuthController.java @@ -0,0 +1,10 @@ +package net.srt.controller; + +/** + * @ClassName : DataServiceApiAuthController + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:22 + */ +public class DataServiceApiAuthController { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java new file mode 100644 index 0000000..a9ffb07 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java @@ -0,0 +1,43 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.query.DataServiceAppQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @ClassName : DataServiceApiLogController + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:29 + */ +@RestController +@RequestMapping("log") +@Tag(name = "api请求日志") +@AllArgsConstructor +public class DataServiceApiLogController { + private final DataServiceApiLogService dataServiceApiLogService; + + @GetMapping("page") + @Operation(summary = "分页") + public Result> page(@Valid DataServiceApiLogQuery query){ + //查询数据 + PageResult page=dataServiceApiLogService.dataPageList(query); + return Result.ok(page); + } + @DeleteMapping + @Operation(summary ="删除") + public Result delete(@RequestBody List idList){ + dataServiceApiLogService.removeId(idList); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java new file mode 100644 index 0000000..9706f7e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java @@ -0,0 +1,30 @@ +package net.srt.convert; + +import net.srt.dto.ApiConfigDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.vo.ApiConfigVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiConfigConvert { + ApiConfigConvert INSTANCE = Mappers.getMapper(ApiConfigConvert.class); + + ApiConfigEntity convert(ApiConfigVo vo); + + ApiConfigVo convert(ApiConfigEntity entity); + + ApiConfigDto convertDto(ApiConfigEntity entity); + + List convertList(List list); + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java new file mode 100644 index 0000000..c0e45ce --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java @@ -0,0 +1,26 @@ +package net.srt.convert; + +import net.srt.entity.ApiGroupEntity; +import net.srt.vo.ApiGroupVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiGroupConvert { + ApiGroupConvert INSTANCE = Mappers.getMapper(ApiGroupConvert.class); + + ApiGroupEntity convert(ApiGroupVo vo); + + ApiGroupVo convert(ApiGroupEntity entity); + + List convertList(List list); + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java new file mode 100644 index 0000000..fb9bfb4 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java @@ -0,0 +1,10 @@ +package net.srt.convert; + +/** + * @ClassName : DataServiceApiAuthConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public interface DataServiceApiAuthConvert { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java new file mode 100644 index 0000000..0921ae7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java @@ -0,0 +1,24 @@ +package net.srt.convert; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.vo.DataServiceApiLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogConvert { + DataServiceApiLogConvert INSTANCE = Mappers.getMapper(DataServiceApiLogConvert.class); + DataServiceApiLogEntity convert(DataServiceApiLogVo vo); + + DataServiceApiLogVo convert(DataServiceApiLogEntity entity); + + List convertList(List list); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java new file mode 100644 index 0000000..d225d1f --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java @@ -0,0 +1,15 @@ +package net.srt.dao; + +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface ApiConfigDao extends BaseDao { + List getResourceList(Map params); + + ApiConfigEntity getById(Long id); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java new file mode 100644 index 0000000..66b1af5 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java @@ -0,0 +1,9 @@ +package net.srt.dao; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ApiGroupDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java new file mode 100644 index 0000000..2d09eb4 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java @@ -0,0 +1,10 @@ +package net.srt.dao; + +/** + * @ClassName : DataServiceApiAuthDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public interface DataServiceApiAuthDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java new file mode 100644 index 0000000..a2cb64e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java @@ -0,0 +1,15 @@ +package net.srt.dao; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +/** + * @ClassName : DataServiceApiLogDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java new file mode 100644 index 0000000..638f19d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java @@ -0,0 +1,48 @@ +package net.srt.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + + +@Data +public class ApiConfigDto implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java new file mode 100644 index 0000000..335ef90 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java @@ -0,0 +1,17 @@ +package net.srt.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AppToken implements Serializable { + private Long appId; + private String appKey; + private String token; + private Long expireAt; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java new file mode 100644 index 0000000..599ea55 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java @@ -0,0 +1,15 @@ +package net.srt.dto; + +import lombok.Data; + +@Data +public class SqlDto { + private Integer sqlDbType; + private Long projectId; + private String statement; + private String sqlSeparator; + private Long databaseId; + private Integer openTrans; + private String jsonParams; + private Integer sqlMaxRow; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java new file mode 100644 index 0000000..4e9eb1d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java @@ -0,0 +1,38 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.ArrayList; +import java.util.Date; + +@Data +@TableName("data_service_api_config") +public class ApiConfigEntity extends BaseEntity { + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String groupPath; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java new file mode 100644 index 0000000..a3afe4c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java @@ -0,0 +1,17 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +@Data +@TableName("data_service_api_group") +public class ApiGroupEntity extends BaseEntity { + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java new file mode 100644 index 0000000..e17b9df --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java @@ -0,0 +1,69 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.Date; + +/** + * @ClassName : DataServiceApiAuthEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:20 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_auth1") +public class DataServiceApiAuthEntity extends BaseEntity { + /** + * app的id + */ + private Long appId; + + /** + * 分组id + */ + private Long groupId; + + /** + * api的id + */ + private Long apiId; + + /** + * 调用次数 不限次数为-1 + */ + private Integer requestTimes; + + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date startTime; + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date endTime; + + /** + * 已调用次数 + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedSuccessTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedFailedTimes; + + /** + * 所属项目id + */ + private Long projectId; + + /** + * 真删 + */ + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java new file mode 100644 index 0000000..1fa6add --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java @@ -0,0 +1,61 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +/** + * @ClassName : DataServiceApiLogEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:11 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_log1") +public class DataServiceApiLogEntity extends BaseEntity { + /** + * url + */ + private String url; + + /** + * 响应状态码 + */ + private Integer status; + + /** + * 时长 + */ + private Long duration; + + /** + * IP地址 + */ + private String ip; + + /** + * app的id + */ + private Long appId; + + /** + * api的id + */ + private Long apiId; + + private String appName; + private String apiName; + + /** + * 错误信息 + */ + private String error; + + /** + * 项目id + */ + private Long projectId; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java new file mode 100644 index 0000000..7351ef9 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java @@ -0,0 +1,27 @@ +package net.srt.handler; + +// 导入必要的类 + +import net.srt.constants.ApiConstants; +import net.srt.entity.ApiConfigEntity; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; + +import java.util.HashMap; +import java.util.Map; + + +// 假设这是你的接口处理类 +public class ApiHandler { + private Map mappings = new HashMap<>(); + + public void registerApi(ApiConfigEntity api) { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + api.getPath()) // 使用API_PREFIX常量 + .methods(RequestMethod.valueOf(api.getType())) + .build(); + + mappings.put(mappingInfo, api); + } + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java new file mode 100644 index 0000000..f74bc8e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java @@ -0,0 +1,21 @@ +package net.srt.handler; + +import net.srt.constants.ApiConstants; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +public class ApiRegistration { + private RequestMappingHandlerMapping handlerMapping; // 注入或实例化 RequestMappingHandlerMapping 对象 + + public void registerApi(String path, String method, Object handler, String handlerMethod) throws NoSuchMethodException { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + path) + .methods(RequestMethod.valueOf(method)) + .build(); + + HandlerMethod handlerMethodObject = new HandlerMethod(handler, handlerMethod); + handlerMapping.registerMapping(mappingInfo, handlerMethodObject.getBean(), handlerMethodObject.getMethod()); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java new file mode 100644 index 0000000..3916db8 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java @@ -0,0 +1,9 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +public interface MappingRequestHandler { + Object invoke(HttpServletRequest request, String apiToken, Map pathVariables, + Map requestParams, Map requestBodys); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java new file mode 100644 index 0000000..d39bee7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java @@ -0,0 +1,25 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; + +public class MappingRequestHandlerExample { + private final MappingRequestHandler handler; + private Method method; + + public MappingRequestHandlerExample(MappingRequestHandler handler) { + this.handler = handler; + try { + method = MappingRequestHandler.class.getDeclaredMethod( + "invoke", HttpServletRequest.class, String.class, Map.class, Map.class, Map.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public void getHandlerAndMethod() { + System.out.println("Handler: " + handler); + System.out.println("Method: " + method); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java new file mode 100644 index 0000000..4cbb148 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java @@ -0,0 +1,21 @@ +package net.srt.query; + +import lombok.Data; +import net.srt.framework.common.query.Query; + +@Data +public class ApiConfigQuery extends Query { + private Long groupId; + private Long resourceId; + private Long appId; + private String name; + private String path; + private String contentType; + private Integer status; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Integer queryApply; + private Integer ifMarket; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java new file mode 100644 index 0000000..20aaa03 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java @@ -0,0 +1,20 @@ +package net.srt.query; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.common.query.Query; + +/** + * @ClassName : DataServiceApiLogQuery + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(description = "api日志") +public class DataServiceApiLogQuery extends Query { + private String ip; + private String apiName; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java new file mode 100644 index 0000000..3f16a51 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java @@ -0,0 +1,40 @@ +package net.srt.service; + +import cn.hutool.http.server.HttpServerResponse; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.ApiConfigQuery; +import net.srt.vo.ApiConfigVo; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface ApiConfigService extends BaseService { + String getIpPort(); + + PageResult page(ApiConfigQuery query); + + void save(ApiConfigVo vo); + + void update(ApiConfigVo vo); + + void delete(List idList); + + PageResult pageResource(ApiConfigQuery query); + + List listActiveByGroupId(Long id); + + void online(Long id); + + void offline(Long id); + + String ipPort(); + + JdbcSelectResult sqlExecute(SqlDto dto); + + void exportDocs(List ids, HttpServletResponse response); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java new file mode 100644 index 0000000..58c0d64 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java @@ -0,0 +1,18 @@ +package net.srt.service; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.vo.ApiGroupVo; + +import java.util.List; + +public interface ApiGroupService extends BaseService { + List listTree(); + + void save(ApiGroupVo vo); + + void update(ApiGroupVo vo); + + void delete(Long id); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java new file mode 100644 index 0000000..5394c03 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiAuthService.java @@ -0,0 +1,10 @@ +package net.srt.service; + +/** + * @ClassName : DataServiceApiAuthService + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public interface DataServiceApiAuthService { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java new file mode 100644 index 0000000..fedf1df --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java @@ -0,0 +1,21 @@ +package net.srt.service; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.vo.DataServiceApiLogVo; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogService + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +public interface DataServiceApiLogService extends BaseService { + PageResult dataPageList(DataServiceApiLogQuery query); + + void removeId(List idList); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java new file mode 100644 index 0000000..fc8145d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java @@ -0,0 +1,260 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.api.ServerNames; +import net.srt.convert.ApiConfigConvert; +import net.srt.dao.ApiConfigDao; +import net.srt.dao.ApiGroupDao; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.constant.Constant; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.framework.security.user.SecurityUser; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; +import srt.cloud.framework.dbswitch.common.util.StringUtil; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Service +@AllArgsConstructor +public class ApiConfigServiceImpl extends BaseServiceImpl implements ApiConfigService { + private final ApiGroupDao apiGroupDao; + private final DiscoveryClient discoveryClient; + private final ApiConfigDao apiConfigDao; + private final Map mappings = new ConcurrentHashMap<>(); + @Override + public String getIpPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort()+"/data-service/api/"; + } + + + + + public void online(Long id) { + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(1); + apiConfigEntity.setReleaseTime(new Date()); + apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); + String routeKey = getRouteKeyByRequestTypeAndUrl(apiConfigEntity.getType(), apiConfigEntity.getPath()); + boolean isExists = checkIfExists(routeKey); + + if (isExists) { + ApiConfigEntity configEntity = mappings.get(routeKey); + if (configEntity != null) { // 添加 null 判断 + offline(configEntity.getId()); // 修正方法调用为传入id + // 从 mappings 中移除该 routeKey + mappings.remove(routeKey); + } + } else { + mappings.put(routeKey, apiConfigEntity); + } + apiConfigDao.updateById(apiConfigEntity); + } + } + + private boolean checkIfExists(String routeKey) { + // 这里是全局的 mappings + Map globalMappings = getGlobalMappings(); + + return globalMappings.containsKey(routeKey); + } + + private Map getGlobalMappings() { + return mappings; + } + + private String getRouteKeyByRequestTypeAndUrl(String type, String path) { + return getRouteKey(type, path); + } + + private String getRouteKey(String type, String path) { + return type.toUpperCase() + "_" + path.toLowerCase(); + } + + @Override + public void offline(Long id) { // 修正参数类型为 Long id + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(0); + apiConfigEntity.setReleaseTime(null); + apiConfigEntity.setReleaseUserId(null); + apiConfigDao.updateById(apiConfigEntity); + }else{ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + // @Override +// public void online(Long id) { +// ApiConfigEntity apiConfigEntity = new ApiConfigEntity(); +// apiConfigEntity.setId(id); +// apiConfigEntity.setStatus(1); +// apiConfigEntity.setReleaseTime(new Date()); +// apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); +// +// apiConfigDao.updateById(apiConfigEntity); +// } + + @Override + public String ipPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort(); + } + + @Override + public JdbcSelectResult sqlExecute(SqlDto dto) { + return null; + } + + @Override + public void exportDocs(List ids, HttpServletResponse response) { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + ServiceInstance instance = instances.get(0); + StringBuilder docs = new StringBuilder("## 接口文档\n---\n"); + List apiConfigEntities = baseMapper.selectBatchIds(ids); + for (ApiConfigEntity api : apiConfigEntities) { + docs.append("### ").append(api.getName()) + .append("\n- IP地址:").append(instance.getHost()) + .append("\n- 端口:").append(instance.getPort()) + .append("\n- 接口地址:/data-service/api/").append(api.getPath()) + .append("\n- 请求方式:").append(api.getType()) + .append("\n- Content-Type:").append(api.getContentType()) + .append("\n- 是否需要鉴权:").append(api.getPrivates() == 1 ? "是" : "否"); + if (api.getPrivates() == 1) { + docs.append("\n- 获取鉴权token:").append("/data-service/api/token/generate?appKey=您的appKey&appSecret=您的appToken"); + } + docs.append("\n- 接口备注:").append(api.getNote()) + .append("\n- 请求参数示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getJsonParam()) ? api.getJsonParam() : "{}").append("\n```\n") + .append("\n- 响应结果示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getResponseResult()) ? api.getResponseResult() : "{\"code\":0,\"msg\":\"success\",\"data\":[]}").append("\n```\n") + .append("\n---\n"); + } + response.setContentType("application/x-msdownload;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment; filename=API DOCS.md"); + OutputStream os = null; + try { + os = response.getOutputStream(); + os.write(docs.toString().getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public PageResult page(ApiConfigQuery query) { + IPage page = baseMapper.selectPage(getPage(query), getWrapper(query)); + + return new PageResult<>(ApiConfigConvert.INSTANCE.convertList(page.getRecords()), page.getTotal()); + } + private LambdaQueryWrapper getWrapper(ApiConfigQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getName()), ApiConfigEntity::getName, query.getName()); + wrapper.like(StringUtil.isNotBlank(query.getPath()), ApiConfigEntity::getPath, query.getPath()); + wrapper.eq(StringUtil.isNotBlank(query.getContentType()), ApiConfigEntity::getContentType, query.getContentType()); + wrapper.eq(query.getStatus()!= null, ApiConfigEntity::getStatus, query.getStatus()); + wrapper.eq(query.getSqlDbType() != null, ApiConfigEntity::getSqlDbType, query.getSqlDbType()); + wrapper.eq(query.getDatabaseId()!= null, ApiConfigEntity::getDatabaseId, query.getDatabaseId()); + wrapper.eq(query.getPrivates()!= null, ApiConfigEntity::getPrivates, query.getPrivates()); + wrapper.eq(query.getOpenTrans()!= null, ApiConfigEntity::getOpenTrans, query.getOpenTrans()); + dataScopeWithoutOrgId(wrapper); + wrapper.orderByDesc(ApiConfigEntity::getCreateTime); + wrapper.orderByDesc(ApiConfigEntity::getId); + return wrapper; + } + + @Override + public void save(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + baseMapper.insert(entity); + } + + @Override + public void update(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + updateById(entity); + } + + @Override + public void delete(List idList) { + removeByIds(idList); + } + + @Override + public PageResult pageResource(ApiConfigQuery query) { + // 查询参数 + Map params = getParams(query); + IPage page = getPage(query); + params.put(Constant.PAGE, page); + // 数据列表 + List list = baseMapper.getResourceList(params); + List apiConfigVos = ApiConfigConvert.INSTANCE.convertList(list); + for (ApiConfigVo apiConfigVo : apiConfigVos) { + ApiGroupEntity groupEntity = apiGroupDao.selectById(apiConfigVo.getGroupId()); + apiConfigVo.setGroup(groupEntity != null ? groupEntity.getPath() : null); + } + return new PageResult<>(apiConfigVos, page.getTotal()); + + } + + @Override + public List listActiveByGroupId(Long id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiConfigEntity::getStatus, 1).eq(ApiConfigEntity::getGroupId, id).orderByDesc(ApiConfigEntity::getId); + dataScopeWithoutOrgId(wrapper); + return baseMapper.selectList(wrapper); + } + + private Map getParams(ApiConfigQuery query) { + Map params = new HashMap<>(); + params.put("ifMarket", query.getIfMarket()); + params.put("queryApply", query.getQueryApply()); + if (query.getQueryApply() != null && query.getQueryApply() == 1) { + params.put("userId", SecurityUser.getUserId()); + } + params.put("resourceId", query.getResourceId()); + params.put("groupId", query.getGroupId()); + params.put("appId", query.getAppId()); + params.put("name", query.getName()); + params.put("path", query.getPath()); + params.put("contentType", query.getContentType()); + params.put("status", query.getStatus()); + params.put("sqlDbType", query.getSqlDbType()); + params.put("databaseId", query.getDatabaseId()); + params.put("privates", query.getPrivates()); + params.put("openTrans", query.getOpenTrans()); + // 数据权限 + params.put(Constant.DATA_SCOPE, getDataScope("dsac", null, null, "project_id", false, true)); + + return params; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java new file mode 100644 index 0000000..a8e29dc --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java @@ -0,0 +1,95 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AllArgsConstructor; +import net.srt.constants.ApiGroupType; +import net.srt.convert.ApiGroupConvert; +import net.srt.dao.ApiGroupDao; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.exception.ServerException; +import net.srt.framework.common.utils.BeanUtil; +import net.srt.framework.common.utils.BuildTreeUtils; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.service.ApiConfigService; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiGroupVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +@Service +@AllArgsConstructor +public class ApiGroupServiceImpl extends BaseServiceImpl implements ApiGroupService{ + private final ApiConfigService apiConfigService; + @Override + public List listTree() { + List treeNodeVos = getTreeNodeVos(); + return BuildTreeUtils.buildTree(treeNodeVos); + } + + private List getTreeNodeVos() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + dataScopeWithoutOrgId(wrapper); + wrapper.orderByAsc(ApiGroupEntity::getOrderNo); + List apiGroupEntities = baseMapper.selectList(wrapper); + return BeanUtil.copyListProperties(apiGroupEntities, TreeNodeVo::new, (oldItem, newItem) -> { + newItem.setLabel(oldItem.getName()); + newItem.setValue(oldItem.getId()); + newItem.setDisabled(oldItem.getType() == 1); + if (newItem.getPath().contains("/")) { + newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); + } + }); + } + + @Override + public void save(ApiGroupVo vo) { + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + entity.setPath(recursionPath(entity, null)); + entity.setProjectId(getProjectId()); + baseMapper.insert(entity); // 使用 insertSelective() 方法进行插入操作 + } + + @Override + public void update(ApiGroupVo vo) { + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + entity.setPath(recursionPath(entity, null)); + entity.setProjectId(getProjectId()); + updateById(entity); + } + + private String recursionPath(ApiGroupEntity groupEntity, String path) { + if (StringUtil.isBlank(path)) { + path = groupEntity.getName(); + } + if (groupEntity.getParentId() != 0) { + ApiGroupEntity parent = getById(groupEntity.getParentId()); + path = parent.getName() + "/" + path; + return recursionPath(parent, path); + } + return path; + } + + @Override + public void delete(Long id) { + //查询有没有子节点 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiGroupEntity::getParentId, id).last(" limit 1"); + ApiGroupEntity one = baseMapper.selectOne(wrapper); + if (one != null) { + throw new ServerException("存在子节点,不允许删除!"); + } + //查询有没有api与之关联 + LambdaQueryWrapper serviceApiConfigWrapper = new LambdaQueryWrapper<>(); + serviceApiConfigWrapper.eq(ApiConfigEntity::getGroupId, id).last(" limit 1"); + ApiConfigEntity apiConfigEntity = apiConfigService.getOne(serviceApiConfigWrapper); + if (apiConfigEntity != null) { + throw new ServerException("节点下有 api 与之关联,不允许删除!"); + } + removeById(id); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java new file mode 100644 index 0000000..89d511e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiAuthServiceImpl.java @@ -0,0 +1,10 @@ +package net.srt.service.impl; + +/** + * @ClassName : DataServiceApiAuthServiceImpl + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +public class DataServiceApiAuthServiceImpl { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java new file mode 100644 index 0000000..058f65a --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java @@ -0,0 +1,51 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.convert.DataServiceApiLogConvert; +import net.srt.dao.DataServiceApiLogDao; +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogServiceImpl + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +@Service +@AllArgsConstructor +public class DataServiceApiLogServiceImpl extends BaseServiceImpl implements DataServiceApiLogService { + @Override + public PageResult dataPageList(DataServiceApiLogQuery query) { + IPage page = baseMapper.selectPage(getPage(query), getWrapper(query)); + + return new PageResult<>(DataServiceApiLogConvert.INSTANCE.convertList(page.getRecords()), page.getTotal()); + } + + @Override + public void removeId(List idList) { + removeByIds(idList); + } + + private LambdaQueryWrapper getWrapper(DataServiceApiLogQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getIp()), DataServiceApiLogEntity::getIp, query.getIp()) + .like(StringUtil.isNotBlank(query.getApiName()), DataServiceApiLogEntity::getApiName, query.getApiName()) + .orderByDesc(DataServiceApiLogEntity::getCreateTime).orderByDesc(DataServiceApiLogEntity::getId); + dataScopeWithoutOrgId(wrapper); + return wrapper; + } + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java new file mode 100644 index 0000000..2d168e2 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java @@ -0,0 +1,55 @@ +package net.srt.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Data +public class ApiConfigVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + private String groupPath; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java new file mode 100644 index 0000000..4193587 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java @@ -0,0 +1,25 @@ +package net.srt.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class ApiGroupVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java new file mode 100644 index 0000000..0c338e3 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java @@ -0,0 +1,72 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName : DataServiceApiLog + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:05 + */ +@Data +@Schema(description = "api请求日志") +public class DataServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java new file mode 100644 index 0000000..d79c064 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java @@ -0,0 +1,73 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-24 15:21 + */ + +@Data +@Schema(description = "api日志") +public class ServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java new file mode 100644 index 0000000..ce741cd --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java @@ -0,0 +1,70 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-21 20:50 + */ + +@Data +@Schema(description = "数据app") +public class ServiceAppVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String note; + + @Schema(description = "appKey") + private String appKey; + + @Schema(description = "appSecret") + private String appSecret; + + @Schema(description = "过期时间") + private String expireDesc; + /** + * 过期时间 -1永久;0 单次失效;> 0 失效时间 + */ + private Long expireDuration; + private Integer ifMarket; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建人") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新人") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + + +} diff --git a/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml new file mode 100644 index 0000000..c76f98e --- /dev/null +++ b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml @@ -0,0 +1,28 @@ + + + + + + + From 1b2ac94b2d6a1a4ead71cf26d00f237cc8fef1c8 Mon Sep 17 00:00:00 2001 From: liyongbin <2954265606@qq.com> Date: Tue, 26 Dec 2023 21:44:05 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B5=8B=E8=AF=95API=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/net/srt/ServiceApplication.java | 21 --- .../srt/controller/ApiConfigController.java | 146 ++++++++++++------ .../srt/controller/ApiGroupController.java | 44 ++++-- .../controller/DataServiceAppController.java | 1 + .../main/java/net/srt/dto/ApiConfigDto.java | 127 +++++++++++++++ .../src/main/java/net/srt/dto/AppToken.java | 16 ++ .../src/main/java/net/srt/dto/SqlDto.java | 32 ++++ .../service/impl/ApiConfigServiceImpl.java | 97 +++++++++--- .../srt/service/impl/ApiGroupServiceImpl.java | 53 ++++++- .../src/main/resources/bootstrap.yml | 4 +- 10 files changed, 436 insertions(+), 105 deletions(-) delete mode 100644 srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java diff --git a/srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java b/srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java deleted file mode 100644 index e8876e7..0000000 --- a/srt-cloud-data-service/src/main/java/net/srt/ServiceApplication.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.srt; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -import org.springframework.cloud.openfeign.EnableFeignClients; - -/** - * @ClassName : ${NAME} - * @Description : ${description} - * @Author : FJJ - * @Date: 2023-12-22 20:44 - */ -@EnableFeignClients -@EnableDiscoveryClient -@SpringBootApplication -public class ServiceApplication { - public static void main(String[] args) { - SpringApplication.run(ServiceApplication.class, args); - } -} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java index 6d4b01e..a205518 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -25,95 +25,149 @@ import java.util.List; public class ApiConfigController { private final ApiConfigService apiConfigService; + /** + * 分页查询接口配置列表 + * @param query 查询条件 + * @return 接口配置列表分页结果 + */ @GetMapping("page") - @Operation(summary = "分页") + @Operation(summary = "分页查询接口配置列表") @PreAuthorize("hasAuthority('data-service:api-config:page')") public Result> page(@Valid ApiConfigQuery query) { - PageResult page = apiConfigService.page(query); - - return Result.ok(page); + PageResult page = apiConfigService.page(query); // 调用service层方法获取分页结果 + return Result.ok(page); // 封装返回结果并返回 } + + /** + * 根据resourceId分页获取接口配置列表 + * @param query 查询条件 + * @return 符合条件的接口配置列表的分页结果 + */ @GetMapping("page-resource") - @Operation(summary = "根据resourceId分页获取") + @Operation(summary = "根据resourceId分页获取接口配置列表") public Result> pageResource(@Valid ApiConfigQuery query){ - PageResult page = apiConfigService.pageResource(query); - - return Result.ok(page); + PageResult page = apiConfigService.pageResource(query); // 调用service层方法根据resourceId分页获取接口配置列表 + return Result.ok(page); // 封装返回结果并返回 } -// @GetMapping("{id}") -// @Operation(summary = "信息") -// public ResponseEntity get(@PathVariable("id") Long id) { -// ApiConfigEntity entity = apiConfigService.getById(id); -// if (entity != null && entity.getStatus() == 1) { -// return ResponseEntity.ok(ApiConfigConvert.INSTANCE.convert(entity)); -// } else { -// return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Resource not found"); -// } -// } - + /** + * 根据id获取接口配置信息 + * @param id 接口配置id + * @return 对应id的接口配置信息 + */ @GetMapping("{id}") - @Operation(summary = "信息") + @Operation(summary = "根据id获取接口配置信息") @PreAuthorize("hasAnyAuthority('data-service:api-config:info')") public Result get(@PathVariable("id") Long id){ - ApiConfigEntity entity=apiConfigService.getById(id); - return Result.ok(ApiConfigConvert.INSTANCE.convert(entity)); + ApiConfigEntity entity=apiConfigService.getById(id); // 根据id获取接口配置实体对象 + return Result.ok(ApiConfigConvert.INSTANCE.convert(entity)); // 封装返回结果并返回 } + /** + * 保存接口配置信息 + * @param vo 接口配置信息 + * @return 保存结果 + */ @PostMapping - @Operation(summary = "保存") + @Operation(summary = "保存接口配置信息") @PreAuthorize("hasAnyAuthority('data-service:api-config:save')") public Result save(@RequestBody ApiConfigVo vo) { - apiConfigService.save(vo); - return Result.ok(); + apiConfigService.save(vo); // 调用service层方法保存接口配置信息 + return Result.ok(); // 封装返回结果并返回 } + + /** + * 修改接口配置信息 + * @param vo 接口配置信息 + * @return 修改结果 + */ @PutMapping - @Operation(summary = "修改") + @Operation(summary = "修改接口配置信息") @PreAuthorize("hasAnyAuthority('data-service:api-config:update')") public Result update(@RequestBody ApiConfigVo vo){ - apiConfigService.update(vo); - return Result.ok(); + apiConfigService.update(vo); // 调用service层方法修改接口配置信息 + return Result.ok(); // 封装返回结果并返回 } + + /** + * 删除接口配置信息 + * @param idList 待删除的接口配置id列表 + * @return 删除结果 + */ @DeleteMapping - @Operation(summary = "删除") + @Operation(summary = "删除接口配置信息") @PreAuthorize("hasAnyAuthority('data-service:api-config:delete')") public Result delete(@RequestBody List idList){ - apiConfigService.delete(idList); - return Result.ok(); + apiConfigService.delete(idList); // 调用service层方法删除接口配置信息 + return Result.ok(); // 封装返回结果并返回 } + + /** + * 获取服务的IP和端口号 + * @return IP和端口号 + */ @GetMapping("getIpPort") + @Operation(summary = "获取服务的IP和端口号") public Result getIpPort() { - return Result.ok(apiConfigService.getIpPort()); + return Result.ok(apiConfigService.getIpPort()); // 封装返回结果并返回 } - @Operation(summary = "获取服务的ip和端口号") + + /** + * 获取服务的IP和端口号 + * @return IP和端口号 + */ @GetMapping("/ip-port") + @Operation(summary = "获取服务的IP和端口号") public Result ipPort() { - return Result.ok(apiConfigService.ipPort()); + return Result.ok(apiConfigService.ipPort()); // 封装返回结果并返回 } - @Operation(summary = "上线") - @PreAuthorize("hasAnyAuthority('data-service:api-config:online')") + + /** + * 上线指定id的接口配置 + * @param id 待上线的接口配置id + * @return 上线结果 + */ @PutMapping("/{id}/online") + @Operation(summary = "上线指定id的接口配置") + @PreAuthorize("hasAnyAuthority('data-service:api-config:online')") public Result online(@PathVariable Long id) { - apiConfigService.online(id); - return Result.ok(); + apiConfigService.online(id); // 调用service层方法上线指定id的接口配置 + return Result.ok(); // 封装返回结果并返回 } - @Operation(summary = "下线") - @PreAuthorize("hasAnyAuthority('data-service:api-config:offline')") + + /** + * 下线指定id的接口配置 + * @param id 待下线的接口配置id + * @return 下线结果 + */ @PutMapping("/{id}/offline") + @Operation(summary = "下线指定id的接口配置") + @PreAuthorize("hasAnyAuthority('data-service:api-config:offline')") public Result offline(@PathVariable Long id){ - apiConfigService.offline(id); - return Result.ok(); + apiConfigService.offline(id); // 调用service层方法下线指定id的接口配置 + return Result.ok(); // 封装返回结果并返回 } - @Operation(summary = "执行sql") + /** + * 执行SQL查询 + * @param dto SQL查询参数 + * @return SQL查询结果 + */ @PostMapping("/sql/execute") + @Operation(summary = "执行SQL查询") public Result sqlExecute(@RequestBody SqlDto dto) { - return Result.ok(apiConfigService.sqlExecute(dto)); + return Result.ok(apiConfigService.sqlExecute(dto)); // 封装返回结果并返回 } - @Operation(summary = "导出 api 文档") + /** + * 导出指定id列表对应的API文档 + * @param ids 待导出API文档的id列表 + * @param response HTTP响应对象 + */ @PostMapping(value = "/export-docs") + @Operation(summary = "导出API文档") public void exportDocs(@RequestBody List ids, HttpServletResponse response) { - apiConfigService.exportDocs(ids, response); + apiConfigService.exportDocs(ids, response); // 调用service层方法导出API文档 } + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java index 8a67958..1d4b9ab 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java @@ -28,42 +28,66 @@ import java.util.List; @AllArgsConstructor public class ApiGroupController { private final ApiGroupService apiGroupService; + /** + * 查询文件分组树 + * @return 文件分组树的列表结果 + */ @GetMapping("api-group") @Operation(summary = "查询文件分组树") public Result> listTree() { - return Result.ok(apiGroupService.listTree()); + return Result.ok(apiGroupService.listTree()); // 调用service层方法查询文件分组树并返回结果 } + /** + * 根据id获取文件分组信息 + * @param id 文件分组id + * @return 对应id的文件分组信息 + */ @GetMapping("{id}") @Operation(summary = "信息") @PreAuthorize("hasAuthority('data-service:api-group:info')") public Result get(@PathVariable("id") Long id){ - ApiGroupEntity entity = apiGroupService.getById(id); - - return Result.ok(ApiGroupConvert.INSTANCE.convert(entity)); + ApiGroupEntity entity = apiGroupService.getById(id); // 根据id获取文件分组实体对象 + return Result.ok(ApiGroupConvert.INSTANCE.convert(entity)); // 封装返回结果并返回 } + /** + * 保存文件分组信息 + * @param vo 文件分组信息 + * @return 保存结果 + */ @PostMapping @Operation(summary = "保存") @PreAuthorize("hasAuthority('data-service:api-group:save')") public Result save(@RequestBody ApiGroupVo vo) { - apiGroupService.save(vo); - return Result.ok(); + apiGroupService.save(vo); // 调用service层方法保存文件分组信息 + return Result.ok(); // 封装返回结果并返回 } + /** + * 修改文件分组信息 + * @param vo 文件分组信息 + * @return 修改结果 + */ @PutMapping @Operation(summary = "修改") @PreAuthorize("hasAuthority('data-service:api-group:update')") public Result update(@RequestBody @Valid ApiGroupVo vo) { - apiGroupService.update(vo); - return Result.ok(); + apiGroupService.update(vo); // 调用service层方法修改文件分组信息 + return Result.ok(); // 封装返回结果并返回 } + /** + * 删除文件分组信息 + * @param id 待删除的文件分组id + * @return 删除结果 + */ @DeleteMapping("/{id}") @Operation(summary = "删除") @PreAuthorize("hasAuthority('data-service:api-group:delete')") public Result delete(@PathVariable Long id) { - apiGroupService.delete(id); - return Result.ok(); + apiGroupService.delete(id); // 调用service层方法删除文件分组信息 + return Result.ok(); // 封装返回结果并返回 } + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java index e138804..7dbdce9 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java @@ -81,4 +81,5 @@ public class DataServiceAppController { dataServiceAppService.cancelAuth(authId); return Result.ok(); } + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java index 638f19d..7807009 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java @@ -12,37 +12,164 @@ import java.util.Date; @Data public class ApiConfigDto implements Serializable { private static final long serialVersionUID = 1L; + /** + * 数据库主键id + */ private Long id; + + /** + * 文件分组id + */ private Long groupId; + + /** + * 文件路径 + */ private String path; + + /** + * 文件类型,如:sql、http等 + */ private String type; + + /** + * 文件名称 + */ private String name; + + /** + * 文件备注 + */ private String note; + + /** + * SQL语句内容 + */ private String sqlText; + + /** + * SQL语句分隔符 + */ private String sqlSeparator; + + /** + * SQL最大行数 + */ private Integer sqlMaxRow; + + /** + * SQL语句参数 + */ private String sqlParam; + + /** + * JSON参数 + */ private String jsonParam; + + /** + * HTTP响应结果 + */ private String responseResult; + + /** + * 内容类型 + */ private String contentType; + + /** + * 状态,1启用,0禁用 + */ private Integer status; + + /** + * 发布时间 + */ private Date releaseTime; + + /** + * 发布用户id + */ private Long releaseUserId; + + /** + * 数据库类型 + */ private Integer sqlDbType; + + /** + * 数据库id + */ private Long databaseId; + + /** + * 是否私有文件,1是,0否 + */ private Integer privates; + + /** + * 开启事务,1是,0否 + */ private Integer openTrans; + + /** + * 项目id + */ private Long projectId; + + /** + * 版本号 + */ private Integer version; + + /** + * 是否删除,1是,0否 + */ private Integer deleted; + + /** + * 创建者id + */ private Long creator; + + /** + * 创建时间 + */ private Date createTime; + + /** + * 更新者id + */ private Long updater; + + /** + * 更新时间 + */ private Date updateTime; + + /** + * 请求次数 + */ private Integer requestedTimes; + + /** + * 请求成功次数 + */ private Integer requestedSuccessTimes; + + /** + * 请求失败次数 + */ private Integer requestedFailedTimes; + + /** + * 授权id + */ private Long authId; + + /** + * 分组名 + */ private String group; } diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java index 335ef90..e3ed399 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java @@ -10,8 +10,24 @@ import java.io.Serializable; @AllArgsConstructor @NoArgsConstructor public class AppToken implements Serializable { + /** + * 应用id + */ private Long appId; + + /** + * 应用密钥 + */ private String appKey; + + /** + * 访问令牌 + */ private String token; + + /** + * 过期时间戳 + */ private Long expireAt; + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java index 599ea55..6c7c7e0 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java @@ -4,12 +4,44 @@ import lombok.Data; @Data public class SqlDto { + /** + * 数据库类型 + */ private Integer sqlDbType; + + /** + * 项目id + */ private Long projectId; + + /** + * SQL语句 + */ private String statement; + + /** + * SQL语句分隔符 + */ private String sqlSeparator; + + /** + * 数据库id + */ private Long databaseId; + + /** + * 是否开启事务,1是,0否 + */ private Integer openTrans; + + /** + * JSON参数 + */ private String jsonParams; + + /** + * SQL最大行数 + */ private Integer sqlMaxRow; + } diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java index fc8145d..cf710c0 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java @@ -43,6 +43,10 @@ public class ApiConfigServiceImpl extends BaseServiceImpl mappings = new ConcurrentHashMap<>(); + /** + * 获取服务实例的IP和端口 + * @return IP和端口 + */ @Override public String getIpPort() { List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); @@ -51,7 +55,10 @@ public class ApiConfigServiceImpl extends BaseServiceImpl instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + // 获取第一个网关服务实例的主机和端口,并返回拼接后的字符串 return instances.get(0).getHost() + ":" + instances.get(0).getPort(); } + @Override public JdbcSelectResult sqlExecute(SqlDto dto) { return null; @@ -168,12 +180,21 @@ public class ApiConfigServiceImpl extends BaseServiceImpl page(ApiConfigQuery query) { + // 执行分页查询,并获取分页对象 IPage page = baseMapper.selectPage(getPage(query), getWrapper(query)); - - return new PageResult<>(ApiConfigConvert.INSTANCE.convertList(page.getRecords()), page.getTotal()); + // 将实体对象列表转换为VO对象列表 + List apiConfigVos = ApiConfigConvert.INSTANCE.convertList(page.getRecords()); + // 返回VO对象列表和总记录数构成的分页结果对象 + return new PageResult<>(apiConfigVos, page.getTotal()); } + private LambdaQueryWrapper getWrapper(ApiConfigQuery query) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.like(StringUtil.isNotBlank(query.getName()), ApiConfigEntity::getName, query.getName()); @@ -190,17 +211,32 @@ public class ApiConfigServiceImpl extends BaseServiceImpl pageResource(ApiConfigQuery query) { - // 查询参数 + // 获取查询参数 Map params = getParams(query); + // 获取分页对象 IPage page = getPage(query); params.put(Constant.PAGE, page); - // 数据列表 + // 查询数据列表 List list = baseMapper.getResourceList(params); + // 将数据列表转换为VO对象列表 List apiConfigVos = ApiConfigConvert.INSTANCE.convertList(list); + // 遍历VO对象列表,设置所属组信息 for (ApiConfigVo apiConfigVo : apiConfigVos) { ApiGroupEntity groupEntity = apiGroupDao.selectById(apiConfigVo.getGroupId()); apiConfigVo.setGroup(groupEntity != null ? groupEntity.getPath() : null); } + // 返回VO对象列表和总记录数构成的分页结果对象 return new PageResult<>(apiConfigVos, page.getTotal()); - } + + /** + * 根据组ID获取有效的API配置列表 + * @param id 组ID + * @return API配置列表 + */ @Override public List listActiveByGroupId(Long id) { + // 创建LambdaQueryWrapper对象 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ApiConfigEntity::getStatus, 1).eq(ApiConfigEntity::getGroupId, id).orderByDesc(ApiConfigEntity::getId); + // 设置查询条件:状态为1(有效),组ID为指定ID,并按照ID降序排序 + wrapper.eq(ApiConfigEntity::getStatus, 1) + .eq(ApiConfigEntity::getGroupId, id) + .orderByDesc(ApiConfigEntity::getId); + // 应用数据范围控制(排除组织ID) dataScopeWithoutOrgId(wrapper); + // 执行查询并返回结果列表 return baseMapper.selectList(wrapper); } + private Map getParams(ApiConfigQuery query) { Map params = new HashMap<>(); params.put("ifMarket", query.getIfMarket()); diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java index a8e29dc..0df58ed 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java @@ -25,43 +25,78 @@ import java.util.List; @AllArgsConstructor public class ApiGroupServiceImpl extends BaseServiceImpl implements ApiGroupService{ private final ApiConfigService apiConfigService; + /** + * 获取API分组树形结构列表 + * @return API分组树形结构列表 + */ @Override public List listTree() { + // 查询所有API分组实体对象,并转换为树节点VO对象列表 List treeNodeVos = getTreeNodeVos(); + // 构建树形结构,并返回根节点列表 return BuildTreeUtils.buildTree(treeNodeVos); } + /** + * 获取API分组树节点VO对象列表 + * @return API分组树节点VO对象列表 + */ private List getTreeNodeVos() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - dataScopeWithoutOrgId(wrapper); - wrapper.orderByAsc(ApiGroupEntity::getOrderNo); + dataScopeWithoutOrgId(wrapper); // 加入数据权限过滤 + wrapper.orderByAsc(ApiGroupEntity::getOrderNo); // 按orderNo升序排序 List apiGroupEntities = baseMapper.selectList(wrapper); + // 将实体对象列表转换为VO对象列表 return BeanUtil.copyListProperties(apiGroupEntities, TreeNodeVo::new, (oldItem, newItem) -> { + // 设置节点名称 newItem.setLabel(oldItem.getName()); + // 设置节点值 newItem.setValue(oldItem.getId()); - newItem.setDisabled(oldItem.getType() == 1); - if (newItem.getPath().contains("/")) { + newItem.setDisabled(oldItem.getType() == 1); // 如果是虚拟节点,设置禁用状态 + if (newItem.getPath().contains("/")) { // 设置父级节点路径 newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); } }); } + /** + * 新增API分组 + * @param vo API分组VO对象 + */ @Override public void save(ApiGroupVo vo) { + // 将VO对象转换为实体对象 ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + // 递归生成路径 entity.setPath(recursionPath(entity, null)); + // 设置项目ID entity.setProjectId(getProjectId()); + // 执行插入操作 baseMapper.insert(entity); // 使用 insertSelective() 方法进行插入操作 } + /** + * 更新API分组 + * @param vo API分组VO对象 + */ @Override public void update(ApiGroupVo vo) { + // 将VO对象转换为实体对象 ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + // 递归生成路径 entity.setPath(recursionPath(entity, null)); + // 设置项目ID entity.setProjectId(getProjectId()); + // 执行更新操作 updateById(entity); } + /** + * 递归生成API分组路径 + * @param groupEntity 分组实体对象 + * @param path 父级路径 + * @return 完整路径 + */ private String recursionPath(ApiGroupEntity groupEntity, String path) { if (StringUtil.isBlank(path)) { path = groupEntity.getName(); @@ -74,22 +109,28 @@ public class ApiGroupServiceImpl extends BaseServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ApiGroupEntity::getParentId, id).last(" limit 1"); ApiGroupEntity one = baseMapper.selectOne(wrapper); if (one != null) { throw new ServerException("存在子节点,不允许删除!"); } - //查询有没有api与之关联 + // 查询是否有API配置与之关联 LambdaQueryWrapper serviceApiConfigWrapper = new LambdaQueryWrapper<>(); serviceApiConfigWrapper.eq(ApiConfigEntity::getGroupId, id).last(" limit 1"); ApiConfigEntity apiConfigEntity = apiConfigService.getOne(serviceApiConfigWrapper); if (apiConfigEntity != null) { throw new ServerException("节点下有 api 与之关联,不允许删除!"); } + // 执行删除操作 removeById(id); } + } diff --git a/srt-cloud-data-service/src/main/resources/bootstrap.yml b/srt-cloud-data-service/src/main/resources/bootstrap.yml index 8cb2c5d..dd97e03 100644 --- a/srt-cloud-data-service/src/main/resources/bootstrap.yml +++ b/srt-cloud-data-service/src/main/resources/bootstrap.yml @@ -14,8 +14,8 @@ spring: nacos: discovery: server-addr: 101.34.77.101:8848 - # 命名空间,默认:public - namespace: 09dff3e2-9790-4d4f-beb6-9baeb01ae040 + # 命名空间,默认:public、 + namespace: a60b2ca1-a8c6-47ae-94f1-741105674655 service: ${spring.application.name} group: srt2.0 config: From 160707d125aa4f5bcbc31fd2e6910dd6be206860 Mon Sep 17 00:00:00 2001 From: liyongbin <2954265606@qq,com> Date: Tue, 26 Dec 2023 22:04:38 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=B5=8B=E8=AF=95API=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/net/srt/controller/ApiConfigController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java index a205518..559dc8e 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -37,7 +37,7 @@ public class ApiConfigController { PageResult page = apiConfigService.page(query); // 调用service层方法获取分页结果 return Result.ok(page); // 封装返回结果并返回 } - +//1 /** * 根据resourceId分页获取接口配置列表 * @param query 查询条件 From ac452af8edbbf5d623a559aa124419b8e39e0db4 Mon Sep 17 00:00:00 2001 From: liyongbin <2954265606@qq,com> Date: Tue, 26 Dec 2023 22:05:48 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=B5=8B=E8=AF=95API=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/net/srt/controller/ApiConfigController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java index 559dc8e..a205518 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -37,7 +37,7 @@ public class ApiConfigController { PageResult page = apiConfigService.page(query); // 调用service层方法获取分页结果 return Result.ok(page); // 封装返回结果并返回 } -//1 + /** * 根据resourceId分页获取接口配置列表 * @param query 查询条件 From f7fb97d16433bf672598b6f95b09668959ae5c3f Mon Sep 17 00:00:00 2001 From: fjj <–1066869486@qq.com> Date: Tue, 26 Dec 2023 22:12:29 +0800 Subject: [PATCH 5/5] fjj8.0 --- .../java/net/srt/GovernanceApplication.java | 1 + .../srt/controller/MetadataController.java | 182 +++---- .../srt/controller/StandardController.java | 12 +- .../main/java/net/srt/dao/StandardDao.java | 1 - .../java/net/srt/service/MetadataService.java | 64 +-- .../srt/service/impl/MetadataServiceImpl.java | 466 +++++++++--------- .../srt/service/impl/StandardServiceImpl.java | 4 +- .../java/net/srt/constants/ApiConstants.java | 8 + .../java/net/srt/constants/ApiController.java | 53 ++ .../java/net/srt/constants/ApiGroupType.java | 19 + .../srt/controller/ApiConfigController.java | 119 +++++ .../srt/controller/ApiGroupController.java | 69 +++ .../controller/DataServiceApiController.java | 29 ++ .../DataServiceApiLogController.java | 43 ++ .../controller/DataServiceAppController.java | 8 +- .../net/srt/convert/ApiConfigConvert.java | 30 ++ .../java/net/srt/convert/ApiGroupConvert.java | 26 + .../convert/DataServiceApiAuthConvert.java | 26 + .../srt/convert/DataServiceApiLogConvert.java | 24 + .../srt/convert/DataServiceAppConvert.java | 1 + .../main/java/net/srt/dao/ApiConfigDao.java | 20 + .../main/java/net/srt/dao/ApiGroupDao.java | 9 + .../net/srt/dao/DataServiceApiAuthDao.java | 15 + .../net/srt/dao/DataServiceApiLogDao.java | 15 + .../java/net/srt/dao/DataServiceAppDao.java | 2 +- .../main/java/net/srt/dto/ApiConfigDto.java | 48 ++ .../src/main/java/net/srt/dto/AppToken.java | 17 + .../src/main/java/net/srt/dto/SqlDto.java | 15 + .../java/net/srt/entity/ApiConfigEntity.java | 38 ++ .../java/net/srt/entity/ApiGroupEntity.java | 17 + .../srt/entity/DataServiceApiAuthEnitiy.java | 70 --- .../srt/entity/DataServiceApiAuthEntity.java | 69 +++ .../srt/entity/DataServiceApiLogEntity.java | 61 +++ .../main/java/net/srt/handler/ApiHandler.java | 27 + .../java/net/srt/handler/ApiRegistration.java | 21 + .../srt/handler/MappingRequestHandler.java | 9 + .../handler/MappingRequestHandlerExample.java | 25 + .../java/net/srt/query/ApiConfigQuery.java | 21 + .../net/srt/query/DataServiceApiLogQuery.java | 20 + .../net/srt/service/ApiConfigService.java | 40 ++ .../java/net/srt/service/ApiGroupService.java | 18 + .../srt/service/DataServiceApiLogService.java | 21 + .../srt/service/DataServiceAppService.java | 7 +- .../service/impl/ApiConfigServiceImpl.java | 266 ++++++++++ .../srt/service/impl/ApiGroupServiceImpl.java | 95 ++++ .../impl/DataServiceApiLogServiceImpl.java | 51 ++ .../impl/DataServiceAppServiceImpl.java | 67 ++- .../main/java/net/srt/utils/EncrypDES.java | 145 ++++++ .../src/main/java/net/srt/vo/ApiConfigVo.java | 55 +++ .../src/main/java/net/srt/vo/ApiGroupVo.java | 25 + .../java/net/srt/vo/DataServiceApiAuthVo.java | 2 + .../java/net/srt/vo/DataServiceApiLogVo.java | 72 +++ .../main/java/net/srt/vo/ServiceApiLogVo.java | 73 +++ .../main/java/net/srt/vo/ServiceAppVo.java | 70 +++ .../main/resources/mapper/ApiConfigDao.xml | 87 ++++ .../resources/mapper/DataServiceAppMapper.xml | 6 +- 56 files changed, 2354 insertions(+), 450 deletions(-) create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiConstants.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java delete mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java create mode 100644 srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java create mode 100644 srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml diff --git a/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java b/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java index 65f1dee..4284f79 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/GovernanceApplication.java @@ -18,6 +18,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients; public class GovernanceApplication { public static void main(String[] args) { SpringApplication.run(GovernanceApplication.class, args); + System.out.println("原神启动!!!!!!!!!!!!!"); } } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java b/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java index 4d51a62..b1888a8 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/controller/MetadataController.java @@ -1,90 +1,92 @@ -package net.srt.controller; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AllArgsConstructor; -import net.srt.framework.common.cache.bean.Neo4jInfo; -import net.srt.framework.common.utils.Result; -import net.srt.framework.common.utils.TreeNodeVo; -import net.srt.service.MetadataService; -import net.srt.vo.MetadataVO; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -@RestController -@RequestMapping("metadata") -@Tag(name = "数据治理-元数据") -@AllArgsConstructor -public class MetadataController { - private final MetadataService metadataService; - - @GetMapping("/list-child") - @Operation(summary = "根据父级id获取信息") - public Result> listByParentId(@RequestParam Long parentId){ - List treeNodeVos = metadataService.listByParentId(parentId); - return Result.ok(treeNodeVos); - } - - @GetMapping("/list-floder") - @Operation(summary = "获取目录树") - public Result> listFloder(){ - List treeNodeVos = metadataService.listFloder(); - return Result.ok(treeNodeVos); - } - - @GetMapping("/list-db") - @Operation(summary = "获取库表目录树") - public Result> listDb(){ - List treeNodeVos = metadataService.listDb(); - return Result.ok(treeNodeVos); - } - - @GetMapping("/list-keyword") - @Operation(summary = "模糊查询") - public Result> listByKeyword(String keyword){ - List treeNodeVos = metadataService.listByKeyword(keyword); - return Result.ok(treeNodeVos); - } - - @GetMapping("{id}") - @Operation(summary = "信息") - public Result get(@PathVariable("id") Long id){ - return Result.ok(metadataService.get(id)); - } - - @PostMapping - @Operation(summary = "保存") - public Result save(@RequestBody MetadataVO vo){ - metadataService.save(vo); - return Result.ok(); - } - - @PutMapping - @Operation(summary = "修改") - public Result update(@RequestBody @Valid MetadataVO vo) { - metadataService.update(vo); - return Result.ok(); - } - - @DeleteMapping("{id}") - @Operation(summary = "删除") - public Result delete(@PathVariable Long id) { - metadataService.delete(id); - return Result.ok(); - } - - @PostMapping("/neo4j") - @Operation(summary = "更新neo4j的url") - public Result upNeo4jInfo(@RequestBody Neo4jInfo neo4jInfo){ - metadataService.upNeo4jInfo(neo4jInfo); - return Result.ok(); - } - - @GetMapping("/neo4j") - @Operation(summary = "获取neo4j的url") - public Result getNeo4jInfo(){ - return Result.ok(metadataService.getNeo4jInfo()); - } -} +//package net.srt.controller; +// +//import io.swagger.v3.oas.annotations.Operation; +//import io.swagger.v3.oas.annotations.tags.Tag; +//import lombok.AllArgsConstructor; +//import net.srt.framework.common.cache.bean.Neo4jInfo; +//import net.srt.framework.common.utils.Result; +//import net.srt.framework.common.utils.TreeNodeVo; +//import net.srt.service.MetadataService; +// +//import net.srt.vo.MetadataVO; +//import org.springframework.web.bind.annotation.*; +// +//import javax.validation.Valid; +//import java.util.List; +// +//@RestController +//@RequestMapping("metadata") +//@Tag(name = "数据治理-元数据") +//@AllArgsConstructor +//public class MetadataController { +// +// private final MetadataService metadataService; +// +// @GetMapping("/list-child") +// @Operation(summary = "根据父级id获取信息") +// public Result> listByParentId(@RequestParam Long parentId){ +// List treeNodeVos = metadataService.listByParentId(parentId); +// return Result.ok(treeNodeVos); +// } +// +// @GetMapping("/list-floder") +// @Operation(summary = "获取目录树") +// public Result> listFloder(){ +// List treeNodeVos = metadataService.listFloder(); +// return Result.ok(treeNodeVos); +// } +// +// @GetMapping("/list-db") +// @Operation(summary = "获取库表目录树") +// public Result> listDb(){ +// List treeNodeVos = metadataService.listDb(); +// return Result.ok(treeNodeVos); +// } +// +// @GetMapping("/list-keyword") +// @Operation(summary = "模糊查询") +// public Result> listByKeyword(String keyword){ +// List treeNodeVos = metadataService.listByKeyword(keyword); +// return Result.ok(treeNodeVos); +// } +// +// @GetMapping("{id}") +// @Operation(summary = "信息") +// public Result get(@PathVariable("id") Long id){ +// return Result.ok(metadataService.get(id)); +// } +// +// @PostMapping +// @Operation(summary = "保存") +// public Result save(@RequestBody MetadataVO vo){ +// metadataService.save(vo); +// return Result.ok(); +// } +// +// @PutMapping +// @Operation(summary = "修改") +// public Result update(@RequestBody @Valid MetadataVO vo) { +// metadataService.update(vo); +// return Result.ok(); +// } +// +// @DeleteMapping("{id}") +// @Operation(summary = "删除") +// public Result delete(@PathVariable Long id) { +// metadataService.delete(id); +// return Result.ok(); +// } +// +// @PostMapping("/neo4j") +// @Operation(summary = "更新neo4j的url") +// public Result upNeo4jInfo(@RequestBody Neo4jInfo neo4jInfo){ +// metadataService.upNeo4jInfo(neo4jInfo); +// return Result.ok(); +// } +// +// @GetMapping("/neo4j") +// @Operation(summary = "获取neo4j的url") +// public Result getNeo4jInfo(){ +// return Result.ok(metadataService.getNeo4jInfo()); +// } +//} diff --git a/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java b/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java index b18e791..2c9b45d 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/controller/StandardController.java @@ -2,6 +2,7 @@ package net.srt.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import net.srt.convert.StandardConvert; import net.srt.entity.DatastandardEntity; import net.srt.entity.StandardEntity; import net.srt.framework.common.utils.BeanUtil; @@ -35,6 +36,13 @@ public class StandardController { return Result.ok(standardService.listTree()); } + @GetMapping("{id}") + @Operation(summary = "信息") + public Result get(@PathVariable("id") Long id){ + StandardEntity entity = standardService.getById(id); + + return Result.ok(StandardConvert.INSTANCE.convert(entity)); + } @PostMapping @Operation(summary = "保存") @@ -50,9 +58,9 @@ public class StandardController { return Result.ok(); } - @DeleteMapping + @DeleteMapping("/{id}") @Operation(summary = "删除") - public Result delete(Long id) { + public Result delete(@PathVariable Long id) { standardService.delete(id); return Result.ok(); } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java b/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java index adc6acc..b2dcb0f 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/dao/StandardDao.java @@ -12,5 +12,4 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface StandardDao extends BaseMapper { - } diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java b/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java index a171909..24a1604 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/MetadataService.java @@ -1,32 +1,32 @@ -package net.srt.service; - -import net.srt.entity.MetadataEntity; -import net.srt.framework.common.cache.bean.Neo4jInfo; -import net.srt.framework.common.utils.TreeNodeVo; -import net.srt.framework.mybatis.service.BaseService; -import net.srt.vo.MetadataVO; - -import java.util.List; - -public interface MetadataService extends BaseService { - List listByParentId(Long parentId); - - List listFloder(); - - List listDb(); - - List listByKeyword(String keyword); - - MetadataVO get(Long id); - - void save(MetadataVO vo); - - - void update(MetadataVO vo); - - void delete(Long id); - - void upNeo4jInfo(Neo4jInfo neo4jInfo); - - Neo4jInfo getNeo4jInfo(); -} +//package net.srt.service; +// +//import net.srt.entity.MetadataEntity; +//import net.srt.framework.common.cache.bean.Neo4jInfo; +//import net.srt.framework.common.utils.TreeNodeVo; +//import net.srt.framework.mybatis.service.BaseService; +//import net.srt.vo.MetadataVO; +// +//import java.util.List; +// +//public interface MetadataService extends BaseService { +// List listByParentId(Long parentId); +// +// List listFloder(); +// +// List listDb(); +// +// List listByKeyword(String keyword); +// +// MetadataVO get(Long id); +// +// void save(MetadataVO vo); +// +// +// void update(MetadataVO vo); +// +// void delete(Long id); +// +// void upNeo4jInfo(Neo4jInfo neo4jInfo); +// +// Neo4jInfo getNeo4jInfo(); +//} diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java index 3f6ec4a..f0ae32c 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/MetadataServiceImpl.java @@ -1,233 +1,233 @@ -package net.srt.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import io.swagger.v3.oas.annotations.servers.Server; -import lombok.AllArgsConstructor; -import net.srt.api.module.data.governance.constant.BuiltInMetamodel; -import net.srt.convert.MetadataConvert; -import net.srt.dao.MetadataDao; -import net.srt.dao.MetadataPropertyDao; -import net.srt.entity.MetadataEntity; -import net.srt.entity.MetadataPropertyEntity; -import net.srt.framework.common.cache.bean.Neo4jInfo; -import net.srt.framework.common.exception.ServerException; -import net.srt.framework.common.utils.BeanUtil; -import net.srt.framework.common.utils.BuildTreeUtils; -import net.srt.framework.common.utils.TreeNodeVo; -import net.srt.framework.mybatis.service.impl.BaseServiceImpl; -import net.srt.framework.security.cache.TokenStoreCache; -import net.srt.service.MetadataService; -import net.srt.vo.MetadataVO; -import net.srt.vo.MetamodelPropertyVO; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import srt.cloud.framework.dbswitch.common.util.StringUtil; - -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -@Server -@AllArgsConstructor -public class MetadataServiceImpl extends BaseServiceImpl implements MetadataService { - - private final MetadataDao metadataDao; - private final MetadataPropertyDao metadataPropertyDao; - private final TokenStoreCache tokenStoreCache; - - @Override - public List listByParentId(Long parentId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(MetadataEntity::getParentId,parentId) - .orderByAsc(MetadataEntity::getOrderNo); - dataScopeWithOrgId(wrapper); - List metadataEntities = baseMapper.selectList(wrapper); - return BeanUtil.copyListProperties(metadataEntities,TreeNodeVo::new, (oldItem, newItem) ->{ - newItem.setLabel(oldItem.getName()); - newItem.setValue(oldItem.getId()); - newItem.setLeaf(BuiltInMetamodel.COLUMN.getId().equals(oldItem.getMetamodelId())); - if(newItem.getPath().contains("/")){ - newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); - } - }); - } - - @Override - public List listFloder() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(MetadataEntity::getIfLeaf,1) - .orderByAsc(MetadataEntity::getOrderNo) - .orderByAsc(MetadataEntity::getId); - dataScopeWithOrgId(wrapper); - List metadatas = baseMapper.selectList(wrapper); - List treeNodeVos = BeanUtil.copyListProperties(metadatas, TreeNodeVo::new, (oldItem, newItem) -> { - newItem.setLabel(oldItem.getName()); - newItem.setValue(oldItem.getId()); - if (newItem.getPath().contains("/")) { - newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); - } - }); - return BuildTreeUtils.buildTree(treeNodeVos); - } - - @Override - public List listDb() { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.in(MetadataEntity::getMetamodelId,BuiltInMetamodel.SCHEMA.getId(),BuiltInMetamodel.TABLE.getId()) - .or() - .isNull(MetadataEntity::getMetamodelId) - .orderByAsc(MetadataEntity::getOrderNo); - dataScopeWithOrgId(wrapper); - List metadatas = baseMapper.selectList(wrapper); - List treeNodeVos = BeanUtil.copyListProperties(metadatas,TreeNodeVo::new, (oldItem, newItem) -> { - newItem.setLabel(oldItem.getName()); - newItem.setValue(oldItem.getId()); - newItem.setDisabled(!BuiltInMetamodel.TABLE.getId().equals(oldItem.getMetamodelId())); - if(newItem.getPath().contains("/")) { - newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); - } - }); - return BuildTreeUtils.buildTree(treeNodeVos); - } - - @Override - public List listByKeyword(String keyword) { - if(StringUtil.isBlank(keyword)){ - return listByParentId(0L); - } - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.like(MetadataEntity::getName,keyword) - .or() - .like(MetadataEntity::getCode,keyword) - .orderByAsc(MetadataEntity::getOrderNo) - .orderByAsc(MetadataEntity::getId); - dataScopeWithOrgId(wrapper); - List metadatas = baseMapper.selectList(wrapper); - List resultList = new ArrayList<>(); - //递归获取父级 - for (MetadataEntity metadata : metadatas) { - recursionAddParent(metadata,resultList); - } - List result = resultList.stream().sorted(Comparator.comparing(MetadataEntity::getOrderNo)).collect(Collectors.toList()); - List treeNodeVos = BeanUtil.copyListProperties(result ,TreeNodeVo::new, (oldItem, newItem) -> { - newItem.setLabel(oldItem.getName()); - newItem.setValue(oldItem.getId()); - newItem.setLeaf(BuiltInMetamodel.COLUMN.getId().equals(oldItem.getMetamodelId())); - if(newItem.getPath().contains("/")) { - newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); - } - }); - return BuildTreeUtils.buildTree(treeNodeVos); - } - - @Override - public MetadataVO get(Long id) { - MetadataEntity metadataEntity = getById(id); - MetadataVO metadataVO = MetadataConvert.INSTANCE.convert(metadataEntity); - metadataVO.setProperties(metadataPropertyDao.listPropertyById(id,metadataEntity.getMetamodelId())); - return metadataVO; - } - - @Override - public void save(MetadataVO vo) { - MetadataEntity entity = MetadataConvert.INSTANCE.convert(vo); - entity.setProjectId(getProjectId()); - entity.setPath(recursionPath(entity,null)); - buildField(entity); - MetadataEntity parentMetadata = baseMapper.selectById(vo.getParentId()); - if(parentMetadata != null) { - entity.setDbType(parentMetadata.getDbType()); - entity.setDatasourceId(parentMetadata.getDatasourceId()); - entity.setCollectTaskId(parentMetadata.getCollectTaskId()); - } - baseMapper.insert(entity); - buildProperties(entity,vo.getProperties()); - } - - @Override - public void update(MetadataVO vo) { - MetadataEntity entity = MetadataConvert.INSTANCE.convert(vo); - entity.setProjectId(getProjectId()); - entity.setPath(recursionPath(entity,null)); - buildField(entity); - updateById(entity); - buildProperties(entity,vo.getProperties()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void delete(Long id) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(MetadataEntity::getParentId,id).last("limit 1"); - if(baseMapper.selectOne(wrapper)!=null){ - throw new ServerException("存在子节点,不可删除!"); - } - removeById(id); - LambdaQueryWrapper propertyWrapper = new LambdaQueryWrapper<>(); - propertyWrapper.eq(MetadataPropertyEntity::getMetadataId,id); - metadataPropertyDao.delete(propertyWrapper); - } - - @Override - public void upNeo4jInfo(Neo4jInfo neo4jInfo) { - tokenStoreCache.saveNeo4jInfo(getProjectId(),neo4jInfo); - } - - @Override - public Neo4jInfo getNeo4jInfo() { - return tokenStoreCache.getNeo4jInfo(getProjectId()); - } - - private void recursionAddParent(MetadataEntity metadataEntity, List resultList){ - if(resultList.stream().noneMatch(item -> metadataEntity.getId().equals(item.getId()))) { - resultList.add(metadataEntity); - } - - if(metadataEntity.getParentId()!=0){ - MetadataEntity parent = getById(metadataEntity.getParentId()); - recursionAddParent(parent,resultList); - } - } - - private void buildField(MetadataEntity entity){ - if(entity.getMetamodelId()!=null){ - entity.setIcon(metadataDao.selectById(entity.getMetamodelId()).getIcon()); - } - if(entity.getIfLeaf() == 1 && entity.getMetamodelId() == null) { - entity.setIcon("/src/assets/folder.png"); - } - } - - private String recursionPath(MetadataEntity metadataEntity, String path) { - if(StringUtil.isBlank(path)){ - path = metadataEntity.getName(); - } - if(metadataEntity.getParentId()!=0){ - MetadataEntity parent = getById(metadataEntity.getParentId()); - path = parent.getName() + "/" +path; - return recursionPath(parent,path); - } - return path; - } - - private void buildProperties(MetadataEntity entity, List properties){ - if(!CollectionUtils.isEmpty(properties)){ - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(MetadataPropertyEntity::getMetadataId,entity.getId()); - for (MetamodelPropertyVO property : properties) { - MetadataPropertyEntity metadataPropertyEntity = new MetadataPropertyEntity(); - metadataPropertyEntity.setMetamodelPropertyId(property.getId()); - metadataPropertyEntity.setMetadataId(entity.getId()); - metadataPropertyEntity.setProperty(property.getValue()); - metadataPropertyEntity.setProjectId(entity.getProjectId()); - if(property.getMetadataPropertyId()!=null){ - metadataPropertyEntity.setId(property.getMetadataPropertyId()); - metadataPropertyDao.updateById(metadataPropertyEntity); - }else { - metadataPropertyDao.insert(metadataPropertyEntity); - } - } - } - } -} +//package net.srt.service.impl; +// +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import io.swagger.v3.oas.annotations.servers.Server; +//import lombok.AllArgsConstructor; +//import net.srt.api.module.data.governance.constant.BuiltInMetamodel; +//import net.srt.convert.MetadataConvert; +//import net.srt.dao.MetadataDao; +//import net.srt.dao.MetadataPropertyDao; +//import net.srt.entity.MetadataEntity; +//import net.srt.entity.MetadataPropertyEntity; +//import net.srt.framework.common.cache.bean.Neo4jInfo; +//import net.srt.framework.common.exception.ServerException; +//import net.srt.framework.common.utils.BeanUtil; +//import net.srt.framework.common.utils.BuildTreeUtils; +//import net.srt.framework.common.utils.TreeNodeVo; +//import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +//import net.srt.framework.security.cache.TokenStoreCache; +//import net.srt.service.MetadataService; +//import net.srt.vo.MetadataVO; +//import net.srt.vo.MetamodelPropertyVO; +//import org.springframework.transaction.annotation.Transactional; +//import org.springframework.util.CollectionUtils; +//import srt.cloud.framework.dbswitch.common.util.StringUtil; +// +//import java.util.ArrayList; +//import java.util.Comparator; +//import java.util.List; +//import java.util.stream.Collectors; +// +//@Server +//@AllArgsConstructor +//public class MetadataServiceImpl extends BaseServiceImpl implements MetadataService { +// +// private final MetadataDao metadataDao; +// private final MetadataPropertyDao metadataPropertyDao; +// private final TokenStoreCache tokenStoreCache; +// +// @Override +// public List listByParentId(Long parentId) { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(MetadataEntity::getParentId,parentId) +// .orderByAsc(MetadataEntity::getOrderNo); +// dataScopeWithOrgId(wrapper); +// List metadataEntities = baseMapper.selectList(wrapper); +// return BeanUtil.copyListProperties(metadataEntities,TreeNodeVo::new, (oldItem, newItem) ->{ +// newItem.setLabel(oldItem.getName()); +// newItem.setValue(oldItem.getId()); +// newItem.setLeaf(BuiltInMetamodel.COLUMN.getId().equals(oldItem.getMetamodelId())); +// if(newItem.getPath().contains("/")){ +// newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); +// } +// }); +// } +// +// @Override +// public List listFloder() { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(MetadataEntity::getIfLeaf,1) +// .orderByAsc(MetadataEntity::getOrderNo) +// .orderByAsc(MetadataEntity::getId); +// dataScopeWithOrgId(wrapper); +// List metadatas = baseMapper.selectList(wrapper); +// List treeNodeVos = BeanUtil.copyListProperties(metadatas, TreeNodeVo::new, (oldItem, newItem) -> { +// newItem.setLabel(oldItem.getName()); +// newItem.setValue(oldItem.getId()); +// if (newItem.getPath().contains("/")) { +// newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); +// } +// }); +// return BuildTreeUtils.buildTree(treeNodeVos); +// } +// +// @Override +// public List listDb() { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.in(MetadataEntity::getMetamodelId,BuiltInMetamodel.SCHEMA.getId(),BuiltInMetamodel.TABLE.getId()) +// .or() +// .isNull(MetadataEntity::getMetamodelId) +// .orderByAsc(MetadataEntity::getOrderNo); +// dataScopeWithOrgId(wrapper); +// List metadatas = baseMapper.selectList(wrapper); +// List treeNodeVos = BeanUtil.copyListProperties(metadatas,TreeNodeVo::new, (oldItem, newItem) -> { +// newItem.setLabel(oldItem.getName()); +// newItem.setValue(oldItem.getId()); +// newItem.setDisabled(!BuiltInMetamodel.TABLE.getId().equals(oldItem.getMetamodelId())); +// if(newItem.getPath().contains("/")) { +// newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); +// } +// }); +// return BuildTreeUtils.buildTree(treeNodeVos); +// } +// +// @Override +// public List listByKeyword(String keyword) { +// if(StringUtil.isBlank(keyword)){ +// return listByParentId(0L); +// } +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.like(MetadataEntity::getName,keyword) +// .or() +// .like(MetadataEntity::getCode,keyword) +// .orderByAsc(MetadataEntity::getOrderNo) +// .orderByAsc(MetadataEntity::getId); +// dataScopeWithOrgId(wrapper); +// List metadatas = baseMapper.selectList(wrapper); +// List resultList = new ArrayList<>(); +// //递归获取父级 +// for (MetadataEntity metadata : metadatas) { +// recursionAddParent(metadata,resultList); +// } +// List result = resultList.stream().sorted(Comparator.comparing(MetadataEntity::getOrderNo)).collect(Collectors.toList()); +// List treeNodeVos = BeanUtil.copyListProperties(result ,TreeNodeVo::new, (oldItem, newItem) -> { +// newItem.setLabel(oldItem.getName()); +// newItem.setValue(oldItem.getId()); +// newItem.setLeaf(BuiltInMetamodel.COLUMN.getId().equals(oldItem.getMetamodelId())); +// if(newItem.getPath().contains("/")) { +// newItem.setParentPath(newItem.getPath().substring(0,newItem.getPath().lastIndexOf("/"))); +// } +// }); +// return BuildTreeUtils.buildTree(treeNodeVos); +// } +// +// @Override +// public MetadataVO get(Long id) { +// MetadataEntity metadataEntity = getById(id); +// MetadataVO metadataVO = MetadataConvert.INSTANCE.convert(metadataEntity); +// metadataVO.setProperties(metadataPropertyDao.listPropertyById(id,metadataEntity.getMetamodelId())); +// return metadataVO; +// } +// +// @Override +// public void save(MetadataVO vo) { +// MetadataEntity entity = MetadataConvert.INSTANCE.convert(vo); +// entity.setProjectId(getProjectId()); +// entity.setPath(recursionPath(entity,null)); +// buildField(entity); +// MetadataEntity parentMetadata = baseMapper.selectById(vo.getParentId()); +// if(parentMetadata != null) { +// entity.setDbType(parentMetadata.getDbType()); +// entity.setDatasourceId(parentMetadata.getDatasourceId()); +// entity.setCollectTaskId(parentMetadata.getCollectTaskId()); +// } +// baseMapper.insert(entity); +// buildProperties(entity,vo.getProperties()); +// } +// +// @Override +// public void update(MetadataVO vo) { +// MetadataEntity entity = MetadataConvert.INSTANCE.convert(vo); +// entity.setProjectId(getProjectId()); +// entity.setPath(recursionPath(entity,null)); +// buildField(entity); +// updateById(entity); +// buildProperties(entity,vo.getProperties()); +// } +// +// @Override +// @Transactional(rollbackFor = Exception.class) +// public void delete(Long id) { +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(MetadataEntity::getParentId,id).last("limit 1"); +// if(baseMapper.selectOne(wrapper)!=null){ +// throw new ServerException("存在子节点,不可删除!"); +// } +// removeById(id); +// LambdaQueryWrapper propertyWrapper = new LambdaQueryWrapper<>(); +// propertyWrapper.eq(MetadataPropertyEntity::getMetadataId,id); +// metadataPropertyDao.delete(propertyWrapper); +// } +// +// @Override +// public void upNeo4jInfo(Neo4jInfo neo4jInfo) { +// tokenStoreCache.saveNeo4jInfo(getProjectId(),neo4jInfo); +// } +// +// @Override +// public Neo4jInfo getNeo4jInfo() { +// return tokenStoreCache.getNeo4jInfo(getProjectId()); +// } +// +// private void recursionAddParent(MetadataEntity metadataEntity, List resultList){ +// if(resultList.stream().noneMatch(item -> metadataEntity.getId().equals(item.getId()))) { +// resultList.add(metadataEntity); +// } +// +// if(metadataEntity.getParentId()!=0){ +// MetadataEntity parent = getById(metadataEntity.getParentId()); +// recursionAddParent(parent,resultList); +// } +// } +// +// private void buildField(MetadataEntity entity){ +// if(entity.getMetamodelId()!=null){ +// entity.setIcon(metadataDao.selectById(entity.getMetamodelId()).getIcon()); +// } +// if(entity.getIfLeaf() == 1 && entity.getMetamodelId() == null) { +// entity.setIcon("/src/assets/folder.png"); +// } +// } +// +// private String recursionPath(MetadataEntity metadataEntity, String path) { +// if(StringUtil.isBlank(path)){ +// path = metadataEntity.getName(); +// } +// if(metadataEntity.getParentId()!=0){ +// MetadataEntity parent = getById(metadataEntity.getParentId()); +// path = parent.getName() + "/" +path; +// return recursionPath(parent,path); +// } +// return path; +// } +// +// private void buildProperties(MetadataEntity entity, List properties){ +// if(!CollectionUtils.isEmpty(properties)){ +// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); +// wrapper.eq(MetadataPropertyEntity::getMetadataId,entity.getId()); +// for (MetamodelPropertyVO property : properties) { +// MetadataPropertyEntity metadataPropertyEntity = new MetadataPropertyEntity(); +// metadataPropertyEntity.setMetamodelPropertyId(property.getId()); +// metadataPropertyEntity.setMetadataId(entity.getId()); +// metadataPropertyEntity.setProperty(property.getValue()); +// metadataPropertyEntity.setProjectId(entity.getProjectId()); +// if(property.getMetadataPropertyId()!=null){ +// metadataPropertyEntity.setId(property.getMetadataPropertyId()); +// metadataPropertyDao.updateById(metadataPropertyEntity); +// }else { +// metadataPropertyDao.insert(metadataPropertyEntity); +// } +// } +// } +// } +//} diff --git a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java index 9a60e6a..abb24e4 100644 --- a/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java +++ b/srt-cloud-data-governance/src/main/java/net/srt/service/impl/StandardServiceImpl.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import net.srt.controller.StandardController; import net.srt.convert.StandardConvert; import net.srt.dao.StandardDao; +import net.srt.entity.MetamodelEntity; import net.srt.entity.StandardEntity; import net.srt.framework.common.exception.ServerException; import net.srt.framework.common.utils.BeanUtil; @@ -66,7 +67,7 @@ public class StandardServiceImpl extends BaseServiceImpl getStatus() { + String status = isOnline ? "online" : "offline"; + return ResponseEntity.ok("API status: " + status); + } + + @GetMapping("/resource/{id}") + public ResponseEntity getResource(@PathVariable Long id) { + if (!isOnline) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + + // 处理获取资源的逻辑... + + String resource = ""; // 假设这里是获取资源的代码 + + if (resource != null) { + return ResponseEntity.ok("Resource: " + resource); + } else { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + + @GetMapping("/offline") + public ResponseEntity offline() { + isOnline = false; + return ResponseEntity.ok("API is now offline"); + } + + @GetMapping("/online") + public ResponseEntity online() { + isOnline = true; + return ResponseEntity.ok("API is now online"); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java new file mode 100644 index 0000000..7ab6c34 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/constants/ApiGroupType.java @@ -0,0 +1,19 @@ +package net.srt.constants; + +public enum ApiGroupType { + FOLDER(1,"数据库"), + API(2,"数据库"); + private final Integer value; + private final String longValue; + + ApiGroupType(Integer value, String longValue) { + this.value = value; + this.longValue = longValue; + } + public Integer getValue() { + return value; + } + public String getLongValue() { + return longValue; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java new file mode 100644 index 0000000..bbe14b5 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiConfigController.java @@ -0,0 +1,119 @@ +package net.srt.controller; +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiConfigConvert; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.util.List; + +@RestController +@RequestMapping("/api-config") +@AllArgsConstructor +public class ApiConfigController { + private final ApiConfigService apiConfigService; + + @GetMapping("page") + @Operation(summary = "分页") + @PreAuthorize("hasAuthority('data-service:api-config:page')") + public Result> page(@Valid ApiConfigQuery query) { + PageResult page = apiConfigService.page(query); + + return Result.ok(page); + } + @GetMapping("page-resource") + @Operation(summary = "根据resourceId分页获取") + public Result> pageResource(@Valid ApiConfigQuery query){ + PageResult page = apiConfigService.pageResource(query); + + return Result.ok(page); + } + + @GetMapping("page-auth") + @Operation(summary = "根据resourceId分页获取") + public Result> pageAuth(@Valid ApiConfigQuery query) { + PageResult page = apiConfigService.page(query); + + return Result.ok(page); + } + + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAnyAuthority('data-service:api-config:info')") + public Result get(@PathVariable("id") Long id){ + ApiConfigEntity entity=apiConfigService.getById(id); + return Result.ok(ApiConfigConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAnyAuthority('data-service:api-config:save')") + public Result save(@RequestBody ApiConfigVo vo) { + apiConfigService.save(vo); + return Result.ok(); + } + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAnyAuthority('data-service:api-config:update')") + public Result update(@RequestBody ApiConfigVo vo){ + apiConfigService.update(vo); + return Result.ok(); + } + @DeleteMapping + @Operation(summary = "删除") + @PreAuthorize("hasAnyAuthority('data-service:api-config:delete')") + public Result delete(@RequestBody List idList){ + apiConfigService.delete(idList); + return Result.ok(); + } + @GetMapping("getIpPort") + public Result getIpPort() { + return Result.ok(apiConfigService.getIpPort()); + } + @Operation(summary = "获取服务的ip和端口号") + @GetMapping("/ip-port") + public Result ipPort() { + return Result.ok(apiConfigService.ipPort()); + } + @Operation(summary = "上线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:online')") + @PutMapping("/{id}/online") + public Result online(@PathVariable Long id) { + apiConfigService.online(id); + return Result.ok(); + } + @Operation(summary = "下线") + @PreAuthorize("hasAnyAuthority('data-service:api-config:offline')") + @PutMapping("/{id}/offline") + public Result offline(@PathVariable Long id){ + apiConfigService.offline(id); + return Result.ok(); + } + + @Operation(summary = "执行sql") + @PostMapping("/sql/execute") + public Result sqlExecute(@RequestBody SqlDto dto) { + return Result.ok(apiConfigService.sqlExecute(dto)); + } + + @Operation(summary = "导出 api 文档") + @PostMapping(value = "/export-docs") + public void exportDocs(@RequestBody List ids, HttpServletResponse response) { + apiConfigService.exportDocs(ids, response); + } + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java new file mode 100644 index 0000000..28675b8 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/ApiGroupController.java @@ -0,0 +1,69 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import lombok.AllArgsConstructor; +import net.srt.convert.ApiGroupConvert; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiConfigVo; +import net.srt.vo.ApiGroupVo; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@RestController +@RequestMapping("/api-group") +@AllArgsConstructor +public class ApiGroupController { + private final ApiGroupService apiGroupService; + @GetMapping + @Operation(summary = "查询文件分组树") + public Result> listTree() { + return Result.ok(apiGroupService.listTree()); + } + + @GetMapping("{id}") + @Operation(summary = "信息") + @PreAuthorize("hasAuthority('data-service:api-group:info')") + public Result get(@PathVariable("id") Long id){ + ApiGroupEntity entity = apiGroupService.getById(id); + + return Result.ok(ApiGroupConvert.INSTANCE.convert(entity)); + } + + @PostMapping + @Operation(summary = "保存") + @PreAuthorize("hasAuthority('data-service:api-group:save')") + public Result save(@RequestBody ApiGroupVo vo) { + apiGroupService.save(vo); + return Result.ok(); + } + + @PutMapping + @Operation(summary = "修改") + @PreAuthorize("hasAuthority('data-service:api-group:update')") + public Result update(@RequestBody @Valid ApiGroupVo vo) { + apiGroupService.update(vo); + return Result.ok(); + } + + @DeleteMapping("/{id}") + @Operation(summary = "删除") + @PreAuthorize("hasAuthority('data-service:api-group:delete')") + public Result delete(@PathVariable Long id) { + apiGroupService.delete(id); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java new file mode 100644 index 0000000..75da63c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiController.java @@ -0,0 +1,29 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import net.srt.dao.DataServiceAppDao; +import net.srt.framework.common.utils.Result; +import net.srt.service.DataServiceAppService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @ClassName : DataServiceApiController + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 20:38 + */ +@RestController +@RequestMapping("api") +@Tag(name = "api") +@AllArgsConstructor +public class DataServiceApiController { + private final DataServiceAppService dataServiceAppService; + @GetMapping("/token/generate") + public Result tokenGenerate(@RequestParam String appKey, @RequestParam String appSecret) { + return Result.ok(dataServiceAppService.tokenGenerate(appKey, appSecret)); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java new file mode 100644 index 0000000..a9ffb07 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceApiLogController.java @@ -0,0 +1,43 @@ +package net.srt.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.common.utils.Result; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.query.DataServiceAppQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +/** + * @ClassName : DataServiceApiLogController + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:29 + */ +@RestController +@RequestMapping("log") +@Tag(name = "api请求日志") +@AllArgsConstructor +public class DataServiceApiLogController { + private final DataServiceApiLogService dataServiceApiLogService; + + @GetMapping("page") + @Operation(summary = "分页") + public Result> page(@Valid DataServiceApiLogQuery query){ + //查询数据 + PageResult page=dataServiceApiLogService.dataPageList(query); + return Result.ok(page); + } + @DeleteMapping + @Operation(summary ="删除") + public Result delete(@RequestBody List idList){ + dataServiceApiLogService.removeId(idList); + return Result.ok(); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java index e138804..c685c94 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java +++ b/srt-cloud-data-service/src/main/java/net/srt/controller/DataServiceAppController.java @@ -8,7 +8,9 @@ import net.srt.framework.common.page.PageResult; import net.srt.framework.common.utils.Result; import net.srt.query.DataServiceAppQuery; import net.srt.service.DataServiceAppService; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -61,16 +63,18 @@ public class DataServiceAppController { return Result.ok(); } + + @PostMapping("/auth") @Operation(summary = "添加授权") - public Result addAuth(@RequestBody DataServiceAppVo authVO){ + public Result addAuth(@RequestBody DataServiceApiAuthVo authVO){ dataServiceAppService.addAuth(authVO); return Result.ok(); } @PutMapping("/auth") @Operation(summary = "修改授权") - public Result upAuth(@RequestBody DataServiceAppVo authVO){ + public Result upAuth(@RequestBody DataServiceApiAuthVo authVO){ dataServiceAppService.upAuth(authVO); return Result.ok(); } diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java new file mode 100644 index 0000000..9706f7e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiConfigConvert.java @@ -0,0 +1,30 @@ +package net.srt.convert; + +import net.srt.dto.ApiConfigDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.vo.ApiConfigVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiConfigConvert { + ApiConfigConvert INSTANCE = Mappers.getMapper(ApiConfigConvert.class); + + ApiConfigEntity convert(ApiConfigVo vo); + + ApiConfigVo convert(ApiConfigEntity entity); + + ApiConfigDto convertDto(ApiConfigEntity entity); + + List convertList(List list); + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java new file mode 100644 index 0000000..c0e45ce --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/ApiGroupConvert.java @@ -0,0 +1,26 @@ +package net.srt.convert; + +import net.srt.entity.ApiGroupEntity; +import net.srt.vo.ApiGroupVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** +* 数据服务-api分组 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Mapper +public interface ApiGroupConvert { + ApiGroupConvert INSTANCE = Mappers.getMapper(ApiGroupConvert.class); + + ApiGroupEntity convert(ApiGroupVo vo); + + ApiGroupVo convert(ApiGroupEntity entity); + + List convertList(List list); + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java new file mode 100644 index 0000000..8e88916 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiAuthConvert.java @@ -0,0 +1,26 @@ +package net.srt.convert; + +import net.srt.entity.DataServiceApiAuthEntity; +import net.srt.vo.DataServiceApiAuthVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @ClassName : DataServiceApiAuthConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 19:45 + */ +@Mapper +public interface DataServiceApiAuthConvert { + DataServiceApiAuthConvert INSTANCE = Mappers.getMapper(DataServiceApiAuthConvert.class); + + + DataServiceApiAuthEntity convert(DataServiceApiAuthVo vo); + + DataServiceApiAuthVo convert(DataServiceApiAuthEntity entity); + + List convertList(List list); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java new file mode 100644 index 0000000..0921ae7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceApiLogConvert.java @@ -0,0 +1,24 @@ +package net.srt.convert; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.vo.DataServiceApiLogVo; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogConvert + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogConvert { + DataServiceApiLogConvert INSTANCE = Mappers.getMapper(DataServiceApiLogConvert.class); + DataServiceApiLogEntity convert(DataServiceApiLogVo vo); + + DataServiceApiLogVo convert(DataServiceApiLogEntity entity); + + List convertList(List list); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java index 3abbab9..2c975e2 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java +++ b/srt-cloud-data-service/src/main/java/net/srt/convert/DataServiceAppConvert.java @@ -19,6 +19,7 @@ public interface DataServiceAppConvert { DataServiceAppEntity convert(DataServiceAppVo vo); + DataServiceAppVo convert(DataServiceAppEntity entity); List convertList(List list); diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java new file mode 100644 index 0000000..970b446 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiConfigDao.java @@ -0,0 +1,20 @@ +package net.srt.dao; + +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface ApiConfigDao extends BaseDao { + List getResourceList(Map params); + + ApiConfigEntity getById(Long id); + + void updateById(@Param("apiId") Long apiId, @Param("id") Long id); + + List getAuthList(Map params); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java new file mode 100644 index 0000000..66b1af5 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/ApiGroupDao.java @@ -0,0 +1,9 @@ +package net.srt.dao; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ApiGroupDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java new file mode 100644 index 0000000..a8d5b16 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiAuthDao.java @@ -0,0 +1,15 @@ +package net.srt.dao; + +import net.srt.entity.DataServiceApiAuthEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +/** + * @ClassName : DataServiceApiAuthDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:23 + */ +@Mapper +public interface DataServiceApiAuthDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java new file mode 100644 index 0000000..a2cb64e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceApiLogDao.java @@ -0,0 +1,15 @@ +package net.srt.dao; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.mybatis.dao.BaseDao; +import org.apache.ibatis.annotations.Mapper; + +/** + * @ClassName : DataServiceApiLogDao + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:30 + */ +@Mapper +public interface DataServiceApiLogDao extends BaseDao { +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java index f93a261..1ef713e 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java +++ b/srt-cloud-data-service/src/main/java/net/srt/dao/DataServiceAppDao.java @@ -13,5 +13,5 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface DataServiceAppDao extends BaseDao { - DataServiceAppEntity selectByApplyId(@Param("applyId") Long applyId); +// DataServiceAppEntity selectByApplyId(@Param("applyId") Long applyId); } diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java new file mode 100644 index 0000000..638f19d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/ApiConfigDto.java @@ -0,0 +1,48 @@ +package net.srt.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + + +@Data +public class ApiConfigDto implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java new file mode 100644 index 0000000..335ef90 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/AppToken.java @@ -0,0 +1,17 @@ +package net.srt.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AppToken implements Serializable { + private Long appId; + private String appKey; + private String token; + private Long expireAt; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java new file mode 100644 index 0000000..599ea55 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/dto/SqlDto.java @@ -0,0 +1,15 @@ +package net.srt.dto; + +import lombok.Data; + +@Data +public class SqlDto { + private Integer sqlDbType; + private Long projectId; + private String statement; + private String sqlSeparator; + private Long databaseId; + private Integer openTrans; + private String jsonParams; + private Integer sqlMaxRow; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java new file mode 100644 index 0000000..4e9eb1d --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiConfigEntity.java @@ -0,0 +1,38 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.ArrayList; +import java.util.Date; + +@Data +@TableName("data_service_api_config") +public class ApiConfigEntity extends BaseEntity { + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String groupPath; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java new file mode 100644 index 0000000..a3afe4c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/ApiGroupEntity.java @@ -0,0 +1,17 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import net.srt.framework.mybatis.entity.BaseEntity; + +@Data +@TableName("data_service_api_group") +public class ApiGroupEntity extends BaseEntity { + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java deleted file mode 100644 index 852114f..0000000 --- a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEnitiy.java +++ /dev/null @@ -1,70 +0,0 @@ -//package net.srt.entity; -// -//import com.baomidou.mybatisplus.annotation.FieldFill; -//import com.baomidou.mybatisplus.annotation.FieldStrategy; -//import com.baomidou.mybatisplus.annotation.TableField; -//import com.baomidou.mybatisplus.annotation.TableName; -//import lombok.Data; -//import lombok.EqualsAndHashCode; -//import net.srt.framework.mybatis.entity.BaseEntity; -// -//import java.util.Date; -// -///** -// * @ClassName : DataServiceApiAuthEnitiy -// * @Description : -// * @Author : FJJ -// * @Date: 2023-12-24 11:30 -// */ -//@EqualsAndHashCode(callSuper=false) -//@Data -//@TableName("data_service_api_auth1") -//public class DataServiceApiAuthEnitiy extends BaseEntity { -// -// /** -// * app的id -// */ -// private Long appId; -// -// /** -// * 分组id -// */ -// private Long groupId; -// -// /** -// * api的id -// */ -// private Long apiId; -// -// /** -// * 调用次数 不限次数为-1 -// */ -// private Integer requestTimes; -// -// @TableField(updateStrategy = FieldStrategy.IGNORED) -// private Date startTime; -// @TableField(updateStrategy = FieldStrategy.IGNORED) -// private Date endTime; -// -// /** -// * 已调用次数 -// */ -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedTimes; -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedSuccessTimes; -// @TableField(updateStrategy = FieldStrategy.NEVER) -// private Integer requestedFailedTimes; -// -// /** -// * 所属项目id -// */ -// private Long projectId; -// -// /** -// * 真删 -// */ -// @TableField(fill = FieldFill.INSERT) -// private Integer deleted; -// -//} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java new file mode 100644 index 0000000..e17b9df --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiAuthEntity.java @@ -0,0 +1,69 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.FieldStrategy; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +import java.util.Date; + +/** + * @ClassName : DataServiceApiAuthEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-26 15:20 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_auth1") +public class DataServiceApiAuthEntity extends BaseEntity { + /** + * app的id + */ + private Long appId; + + /** + * 分组id + */ + private Long groupId; + + /** + * api的id + */ + private Long apiId; + + /** + * 调用次数 不限次数为-1 + */ + private Integer requestTimes; + + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date startTime; + @TableField(updateStrategy = FieldStrategy.IGNORED) + private Date endTime; + + /** + * 已调用次数 + */ + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedSuccessTimes; + @TableField(updateStrategy = FieldStrategy.NEVER) + private Integer requestedFailedTimes; + + /** + * 所属项目id + */ + private Long projectId; + + /** + * 真删 + */ + @TableField(fill = FieldFill.INSERT) + private Integer deleted; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java new file mode 100644 index 0000000..1fa6add --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/entity/DataServiceApiLogEntity.java @@ -0,0 +1,61 @@ +package net.srt.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.mybatis.entity.BaseEntity; + +/** + * @ClassName : DataServiceApiLogEntity + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:11 + */ +@EqualsAndHashCode(callSuper = false) +@Data +@TableName("data_service_api_log1") +public class DataServiceApiLogEntity extends BaseEntity { + /** + * url + */ + private String url; + + /** + * 响应状态码 + */ + private Integer status; + + /** + * 时长 + */ + private Long duration; + + /** + * IP地址 + */ + private String ip; + + /** + * app的id + */ + private Long appId; + + /** + * api的id + */ + private Long apiId; + + private String appName; + private String apiName; + + /** + * 错误信息 + */ + private String error; + + /** + * 项目id + */ + private Long projectId; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java new file mode 100644 index 0000000..7351ef9 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiHandler.java @@ -0,0 +1,27 @@ +package net.srt.handler; + +// 导入必要的类 + +import net.srt.constants.ApiConstants; +import net.srt.entity.ApiConfigEntity; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; + +import java.util.HashMap; +import java.util.Map; + + +// 假设这是你的接口处理类 +public class ApiHandler { + private Map mappings = new HashMap<>(); + + public void registerApi(ApiConfigEntity api) { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + api.getPath()) // 使用API_PREFIX常量 + .methods(RequestMethod.valueOf(api.getType())) + .build(); + + mappings.put(mappingInfo, api); + } + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java new file mode 100644 index 0000000..f74bc8e --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/ApiRegistration.java @@ -0,0 +1,21 @@ +package net.srt.handler; + +import net.srt.constants.ApiConstants; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +public class ApiRegistration { + private RequestMappingHandlerMapping handlerMapping; // 注入或实例化 RequestMappingHandlerMapping 对象 + + public void registerApi(String path, String method, Object handler, String handlerMethod) throws NoSuchMethodException { + RequestMappingInfo mappingInfo = RequestMappingInfo + .paths(ApiConstants.API_PREFIX + path) + .methods(RequestMethod.valueOf(method)) + .build(); + + HandlerMethod handlerMethodObject = new HandlerMethod(handler, handlerMethod); + handlerMapping.registerMapping(mappingInfo, handlerMethodObject.getBean(), handlerMethodObject.getMethod()); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java new file mode 100644 index 0000000..3916db8 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandler.java @@ -0,0 +1,9 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +public interface MappingRequestHandler { + Object invoke(HttpServletRequest request, String apiToken, Map pathVariables, + Map requestParams, Map requestBodys); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java new file mode 100644 index 0000000..d39bee7 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/handler/MappingRequestHandlerExample.java @@ -0,0 +1,25 @@ +package net.srt.handler; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; + +public class MappingRequestHandlerExample { + private final MappingRequestHandler handler; + private Method method; + + public MappingRequestHandlerExample(MappingRequestHandler handler) { + this.handler = handler; + try { + method = MappingRequestHandler.class.getDeclaredMethod( + "invoke", HttpServletRequest.class, String.class, Map.class, Map.class, Map.class); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + + public void getHandlerAndMethod() { + System.out.println("Handler: " + handler); + System.out.println("Method: " + method); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java new file mode 100644 index 0000000..4cbb148 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/ApiConfigQuery.java @@ -0,0 +1,21 @@ +package net.srt.query; + +import lombok.Data; +import net.srt.framework.common.query.Query; + +@Data +public class ApiConfigQuery extends Query { + private Long groupId; + private Long resourceId; + private Long appId; + private String name; + private String path; + private String contentType; + private Integer status; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Integer queryApply; + private Integer ifMarket; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java new file mode 100644 index 0000000..20aaa03 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/query/DataServiceApiLogQuery.java @@ -0,0 +1,20 @@ +package net.srt.query; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import net.srt.framework.common.query.Query; + +/** + * @ClassName : DataServiceApiLogQuery + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(description = "api日志") +public class DataServiceApiLogQuery extends Query { + private String ip; + private String apiName; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java new file mode 100644 index 0000000..3f16a51 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiConfigService.java @@ -0,0 +1,40 @@ +package net.srt.service; + +import cn.hutool.http.server.HttpServerResponse; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.ApiConfigQuery; +import net.srt.vo.ApiConfigVo; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface ApiConfigService extends BaseService { + String getIpPort(); + + PageResult page(ApiConfigQuery query); + + void save(ApiConfigVo vo); + + void update(ApiConfigVo vo); + + void delete(List idList); + + PageResult pageResource(ApiConfigQuery query); + + List listActiveByGroupId(Long id); + + void online(Long id); + + void offline(Long id); + + String ipPort(); + + JdbcSelectResult sqlExecute(SqlDto dto); + + void exportDocs(List ids, HttpServletResponse response); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java new file mode 100644 index 0000000..58c0d64 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/ApiGroupService.java @@ -0,0 +1,18 @@ +package net.srt.service; + +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.vo.ApiGroupVo; + +import java.util.List; + +public interface ApiGroupService extends BaseService { + List listTree(); + + void save(ApiGroupVo vo); + + void update(ApiGroupVo vo); + + void delete(Long id); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java new file mode 100644 index 0000000..fedf1df --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceApiLogService.java @@ -0,0 +1,21 @@ +package net.srt.service; + +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.BaseService; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.vo.DataServiceApiLogVo; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogService + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +public interface DataServiceApiLogService extends BaseService { + PageResult dataPageList(DataServiceApiLogQuery query); + + void removeId(List idList); +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java index d0c4606..96b0bdc 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/DataServiceAppService.java @@ -4,6 +4,7 @@ import net.srt.entity.DataServiceAppEntity; import net.srt.framework.common.page.PageResult; import net.srt.framework.mybatis.service.BaseService; import net.srt.query.DataServiceAppQuery; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; import java.util.List; @@ -23,9 +24,11 @@ public interface DataServiceAppService extends BaseService void delete(List idList); - void addAuth(DataServiceAppVo authVO); + void addAuth(DataServiceApiAuthVo authVO); - void upAuth(DataServiceAppVo authVO); + void upAuth(DataServiceApiAuthVo authVO); void cancelAuth(Long authId); + + String tokenGenerate(String appKey, String appSecret); } diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java new file mode 100644 index 0000000..65d63b0 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiConfigServiceImpl.java @@ -0,0 +1,266 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.api.ServerNames; +import net.srt.convert.ApiConfigConvert; +import net.srt.dao.ApiConfigDao; +import net.srt.dao.ApiGroupDao; +import net.srt.dto.SqlDto; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.constant.Constant; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.framework.security.user.SecurityUser; +import net.srt.query.ApiConfigQuery; +import net.srt.service.ApiConfigService; +import net.srt.vo.ApiConfigVo; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; +import srt.cloud.framework.dbswitch.common.util.StringUtil; +import srt.cloud.framework.dbswitch.core.model.JdbcSelectResult; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Service +@AllArgsConstructor +public class ApiConfigServiceImpl extends BaseServiceImpl implements ApiConfigService { + private final ApiGroupDao apiGroupDao; + private final DiscoveryClient discoveryClient; + private final ApiConfigDao apiConfigDao; + private final Map mappings = new ConcurrentHashMap<>(); + @Override + public String getIpPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort()+"/data-service/api/"; + } + + + + + public void online(Long id) { + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(1); + apiConfigEntity.setReleaseTime(new Date()); + apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); + String routeKey = getRouteKeyByRequestTypeAndUrl(apiConfigEntity.getType(), apiConfigEntity.getPath()); + boolean isExists = checkIfExists(routeKey); + + if (isExists) { + ApiConfigEntity configEntity = mappings.get(routeKey); + if (configEntity != null) { // 添加 null 判断 + offline(configEntity.getId()); // 修正方法调用为传入id + // 从 mappings 中移除该 routeKey + mappings.remove(routeKey); + } + } else { + mappings.put(routeKey, apiConfigEntity); + } + apiConfigDao.updateById(apiConfigEntity); + } + } + + private boolean checkIfExists(String routeKey) { + // 这里是全局的 mappings + Map globalMappings = getGlobalMappings(); + + return globalMappings.containsKey(routeKey); + } + + private Map getGlobalMappings() { + return mappings; + } + + private String getRouteKeyByRequestTypeAndUrl(String type, String path) { + return getRouteKey(type, path); + } + + private String getRouteKey(String type, String path) { + return type.toUpperCase() + "_" + path.toLowerCase(); + } + + @Override + public void offline(Long id) { // 修正参数类型为 Long id + ApiConfigEntity apiConfigEntity = apiConfigDao.getById(id); + if (apiConfigEntity != null) { + apiConfigEntity.setStatus(0); + apiConfigEntity.setReleaseTime(null); + apiConfigEntity.setReleaseUserId(null); + apiConfigDao.updateById(apiConfigEntity); + }else{ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Resource not found"); + } + } + // @Override +// public void online(Long id) { +// ApiConfigEntity apiConfigEntity = new ApiConfigEntity(); +// apiConfigEntity.setId(id); +// apiConfigEntity.setStatus(1); +// apiConfigEntity.setReleaseTime(new Date()); +// apiConfigEntity.setReleaseUserId(SecurityUser.getUserId()); +// +// apiConfigDao.updateById(apiConfigEntity); +// } + + @Override + public String ipPort() { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + return instances.get(0).getHost() + ":" + instances.get(0).getPort(); + } + + @Override + public JdbcSelectResult sqlExecute(SqlDto dto) { + return null; + } + + @Override + public void exportDocs(List ids, HttpServletResponse response) { + List instances = discoveryClient.getInstances(ServerNames.GATEWAY_SERVER_NAME); + ServiceInstance instance = instances.get(0); + StringBuilder docs = new StringBuilder("## 接口文档\n---\n"); + List apiConfigEntities = baseMapper.selectBatchIds(ids); + for (ApiConfigEntity api : apiConfigEntities) { + docs.append("### ").append(api.getName()) + .append("\n- IP地址:").append(instance.getHost()) + .append("\n- 端口:").append(instance.getPort()) + .append("\n- 接口地址:/data-service/api/").append(api.getPath()) + .append("\n- 请求方式:").append(api.getType()) + .append("\n- Content-Type:").append(api.getContentType()) + .append("\n- 是否需要鉴权:").append(api.getPrivates() == 1 ? "是" : "否"); + if (api.getPrivates() == 1) { + docs.append("\n- 获取鉴权token:").append("/data-service/api/token/generate?appKey=您的appKey&appSecret=您的appToken"); + } + docs.append("\n- 接口备注:").append(api.getNote()) + .append("\n- 请求参数示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getJsonParam()) ? api.getJsonParam() : "{}").append("\n```\n") + .append("\n- 响应结果示例:").append("\n```json\n").append(StringUtil.isNotBlank(api.getResponseResult()) ? api.getResponseResult() : "{\"code\":0,\"msg\":\"success\",\"data\":[]}").append("\n```\n") + .append("\n---\n"); + } + response.setContentType("application/x-msdownload;charset=utf-8"); + response.setHeader("Content-Disposition", "attachment; filename=API DOCS.md"); + OutputStream os = null; + try { + os = response.getOutputStream(); + os.write(docs.toString().getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public PageResult page(ApiConfigQuery query) { + // 查询参数 + Map params = getParams(query); + // 分页查询 + query.setOrder("dsac.id"); + IPage page = getPage(query); + params.put(Constant.PAGE, page); + // 数据列表 + List list = baseMapper.getAuthList(params); + return new PageResult<>(ApiConfigConvert.INSTANCE.convertList(list), page.getTotal()); + } + private LambdaQueryWrapper getWrapper(ApiConfigQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getName()), ApiConfigEntity::getName, query.getName()); + wrapper.like(StringUtil.isNotBlank(query.getPath()), ApiConfigEntity::getPath, query.getPath()); + wrapper.eq(StringUtil.isNotBlank(query.getContentType()), ApiConfigEntity::getContentType, query.getContentType()); + wrapper.eq(query.getStatus()!= null, ApiConfigEntity::getStatus, query.getStatus()); + wrapper.eq(query.getSqlDbType() != null, ApiConfigEntity::getSqlDbType, query.getSqlDbType()); + wrapper.eq(query.getDatabaseId()!= null, ApiConfigEntity::getDatabaseId, query.getDatabaseId()); + wrapper.eq(query.getPrivates()!= null, ApiConfigEntity::getPrivates, query.getPrivates()); + wrapper.eq(query.getOpenTrans()!= null, ApiConfigEntity::getOpenTrans, query.getOpenTrans()); + dataScopeWithoutOrgId(wrapper); + wrapper.orderByDesc(ApiConfigEntity::getCreateTime); + wrapper.orderByDesc(ApiConfigEntity::getId); + return wrapper; + } + + @Override + public void save(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + baseMapper.insert(entity); + } + + @Override + public void update(ApiConfigVo vo) { + ApiConfigEntity entity = ApiConfigConvert.INSTANCE.convert(vo); + entity.setProjectId(getProjectId()); + updateById(entity); + } + + @Override + public void delete(List idList) { + removeByIds(idList); + } + + @Override + public PageResult pageResource(ApiConfigQuery query) { + // 查询参数 + Map params = getParams(query); + IPage page = getPage(query); + params.put(Constant.PAGE, page); + // 数据列表 + List list = baseMapper.getResourceList(params); + List apiConfigVos = ApiConfigConvert.INSTANCE.convertList(list); + for (ApiConfigVo apiConfigVo : apiConfigVos) { + ApiGroupEntity groupEntity = apiGroupDao.selectById(apiConfigVo.getGroupId()); + apiConfigVo.setGroup(groupEntity != null ? groupEntity.getPath() : null); + } + return new PageResult<>(apiConfigVos, page.getTotal()); + + } + + @Override + public List listActiveByGroupId(Long id) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiConfigEntity::getStatus, 1).eq(ApiConfigEntity::getGroupId, id).orderByDesc(ApiConfigEntity::getId); + dataScopeWithoutOrgId(wrapper); + return baseMapper.selectList(wrapper); + } + + private Map getParams(ApiConfigQuery query) { + Map params = new HashMap<>(); + params.put("ifMarket", query.getIfMarket()); + params.put("queryApply", query.getQueryApply()); + if (query.getQueryApply() != null && query.getQueryApply() == 1) { + params.put("userId", SecurityUser.getUserId()); + } + params.put("resourceId", query.getResourceId()); + params.put("groupId", query.getGroupId()); + params.put("appId", query.getAppId()); + params.put("name", query.getName()); + params.put("path", query.getPath()); + params.put("contentType", query.getContentType()); + params.put("status", query.getStatus()); + params.put("sqlDbType", query.getSqlDbType()); + params.put("databaseId", query.getDatabaseId()); + params.put("privates", query.getPrivates()); + params.put("openTrans", query.getOpenTrans()); + // 数据权限 + params.put(Constant.DATA_SCOPE, getDataScope("dsac", null, null, "project_id", false, true)); + + return params; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java new file mode 100644 index 0000000..a8e29dc --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/ApiGroupServiceImpl.java @@ -0,0 +1,95 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.AllArgsConstructor; +import net.srt.constants.ApiGroupType; +import net.srt.convert.ApiGroupConvert; +import net.srt.dao.ApiGroupDao; +import net.srt.entity.ApiConfigEntity; +import net.srt.entity.ApiGroupEntity; +import net.srt.framework.common.exception.ServerException; +import net.srt.framework.common.utils.BeanUtil; +import net.srt.framework.common.utils.BuildTreeUtils; +import net.srt.framework.common.utils.TreeNodeVo; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.service.ApiConfigService; +import net.srt.service.ApiGroupService; +import net.srt.vo.ApiGroupVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +@Service +@AllArgsConstructor +public class ApiGroupServiceImpl extends BaseServiceImpl implements ApiGroupService{ + private final ApiConfigService apiConfigService; + @Override + public List listTree() { + List treeNodeVos = getTreeNodeVos(); + return BuildTreeUtils.buildTree(treeNodeVos); + } + + private List getTreeNodeVos() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + dataScopeWithoutOrgId(wrapper); + wrapper.orderByAsc(ApiGroupEntity::getOrderNo); + List apiGroupEntities = baseMapper.selectList(wrapper); + return BeanUtil.copyListProperties(apiGroupEntities, TreeNodeVo::new, (oldItem, newItem) -> { + newItem.setLabel(oldItem.getName()); + newItem.setValue(oldItem.getId()); + newItem.setDisabled(oldItem.getType() == 1); + if (newItem.getPath().contains("/")) { + newItem.setParentPath(newItem.getPath().substring(0, newItem.getPath().lastIndexOf("/"))); + } + }); + } + + @Override + public void save(ApiGroupVo vo) { + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + entity.setPath(recursionPath(entity, null)); + entity.setProjectId(getProjectId()); + baseMapper.insert(entity); // 使用 insertSelective() 方法进行插入操作 + } + + @Override + public void update(ApiGroupVo vo) { + ApiGroupEntity entity = ApiGroupConvert.INSTANCE.convert(vo); + entity.setPath(recursionPath(entity, null)); + entity.setProjectId(getProjectId()); + updateById(entity); + } + + private String recursionPath(ApiGroupEntity groupEntity, String path) { + if (StringUtil.isBlank(path)) { + path = groupEntity.getName(); + } + if (groupEntity.getParentId() != 0) { + ApiGroupEntity parent = getById(groupEntity.getParentId()); + path = parent.getName() + "/" + path; + return recursionPath(parent, path); + } + return path; + } + + @Override + public void delete(Long id) { + //查询有没有子节点 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(ApiGroupEntity::getParentId, id).last(" limit 1"); + ApiGroupEntity one = baseMapper.selectOne(wrapper); + if (one != null) { + throw new ServerException("存在子节点,不允许删除!"); + } + //查询有没有api与之关联 + LambdaQueryWrapper serviceApiConfigWrapper = new LambdaQueryWrapper<>(); + serviceApiConfigWrapper.eq(ApiConfigEntity::getGroupId, id).last(" limit 1"); + ApiConfigEntity apiConfigEntity = apiConfigService.getOne(serviceApiConfigWrapper); + if (apiConfigEntity != null) { + throw new ServerException("节点下有 api 与之关联,不允许删除!"); + } + removeById(id); + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java new file mode 100644 index 0000000..058f65a --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceApiLogServiceImpl.java @@ -0,0 +1,51 @@ +package net.srt.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.AllArgsConstructor; +import net.srt.convert.DataServiceApiLogConvert; +import net.srt.dao.DataServiceApiLogDao; +import net.srt.entity.DataServiceApiLogEntity; +import net.srt.framework.common.page.PageResult; +import net.srt.framework.mybatis.service.impl.BaseServiceImpl; +import net.srt.query.DataServiceApiLogQuery; +import net.srt.service.DataServiceApiLogService; +import net.srt.vo.DataServiceApiLogVo; +import org.springframework.stereotype.Service; +import srt.cloud.framework.dbswitch.common.util.StringUtil; + +import java.util.List; + +/** + * @ClassName : DataServiceApiLogServiceImpl + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:31 + */ +@Service +@AllArgsConstructor +public class DataServiceApiLogServiceImpl extends BaseServiceImpl implements DataServiceApiLogService { + @Override + public PageResult dataPageList(DataServiceApiLogQuery query) { + IPage page = baseMapper.selectPage(getPage(query), getWrapper(query)); + + return new PageResult<>(DataServiceApiLogConvert.INSTANCE.convertList(page.getRecords()), page.getTotal()); + } + + @Override + public void removeId(List idList) { + removeByIds(idList); + } + + private LambdaQueryWrapper getWrapper(DataServiceApiLogQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getIp()), DataServiceApiLogEntity::getIp, query.getIp()) + .like(StringUtil.isNotBlank(query.getApiName()), DataServiceApiLogEntity::getApiName, query.getApiName()) + .orderByDesc(DataServiceApiLogEntity::getCreateTime).orderByDesc(DataServiceApiLogEntity::getId); + dataScopeWithoutOrgId(wrapper); + return wrapper; + } + + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java index a4e251c..7f8fab4 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java +++ b/srt-cloud-data-service/src/main/java/net/srt/service/impl/DataServiceAppServiceImpl.java @@ -4,8 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; +import net.srt.convert.DataServiceApiAuthConvert; import net.srt.convert.DataServiceAppConvert; +import net.srt.dao.ApiConfigDao; +import net.srt.dao.DataServiceApiAuthDao; import net.srt.dao.DataServiceAppDao; +import net.srt.dto.AppToken; +import net.srt.entity.DataServiceApiAuthEntity; import net.srt.entity.DataServiceAppEntity; import net.srt.framework.common.exception.ServerException; import net.srt.framework.common.page.PageResult; @@ -13,7 +18,9 @@ import net.srt.framework.mybatis.service.impl.BaseServiceImpl; import net.srt.framework.security.user.SecurityUser; import net.srt.query.DataServiceAppQuery; import net.srt.service.DataServiceAppService; +import net.srt.vo.DataServiceApiAuthVo; import net.srt.vo.DataServiceAppVo; +import org.apache.commons.lang.RandomStringUtils; import org.springframework.stereotype.Service; import srt.cloud.framework.dbswitch.common.util.StringUtil; @@ -30,6 +37,8 @@ import java.util.List; @AllArgsConstructor public class DataServiceAppServiceImpl extends BaseServiceImpl implements DataServiceAppService { private final DataServiceAppDao dataServiceAppDao; + private final ApiConfigDao apiConfigDao; + private final DataServiceApiAuthDao dataServiceApiAuthDao; @Override public PageResult page(DataServiceAppQuery query) { IPage page=baseMapper.selectPage(getPage(query),null); @@ -56,14 +65,18 @@ public class DataServiceAppServiceImpl extends BaseServiceImpl wrapper = Wrappers.lambdaQuery(); + wrapper.eq(DataServiceAppEntity::getAppKey,appKey).last("limit 1"); + DataServiceAppEntity dataServiceAppEntity = baseMapper.selectOne(wrapper); + if (dataServiceAppEntity==null){ + throw new RuntimeException("appKey不存在"); + } + if (!appSecret.equals(dataServiceAppEntity.getAppSecret())){ + throw new ServerException("appSecret错误"); + } + //生成token + String token = RandomStringUtils.random(32, true, true); + AppToken appToken = new AppToken(); + appToken.setToken(token); + appToken.setAppKey(appKey); + appToken.setAppId(dataServiceAppEntity.getId()); + if (dataServiceAppEntity.getExpireDuration()==0){ + appToken.setExpireAt(0L); + } else if (dataServiceAppEntity.getExpireDuration()== -1) { + appToken.setExpireAt(-1L); + }else if (dataServiceAppEntity.getExpireDuration()>0){ + long l = System.currentTimeMillis() + dataServiceAppEntity.getExpireDuration() * 1000; + appToken.setExpireAt(l); + } + return appToken.getToken(); + } -// private LambdaQueryWrapper getWrapper(DataServiceAppQuery query) { -// LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); -// wrapper.like(StringUtil.isNotBlank(query.getName()), DataServiceAppEntity::getName, query.getName()) -// .eq(DataServiceAppEntity::getIfMarket, query.getIfMarket() != null ? query.getIfMarket() : 0) -// .eq(query.getIfMarket() != null, DataServiceAppEntity::getCreator, SecurityUser.getUserId()) -// .eq(StringUtil.isNotBlank(query.getAppKey()), DataServiceAppEntity::getAppKey, query.getAppKey()) -// .orderByDesc(DataServiceAppEntity::getCreateTime).orderByDesc(DataServiceAppEntity::getId); -// return wrapper; -// } + + private LambdaQueryWrapper getWrapper(DataServiceAppQuery query) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.like(StringUtil.isNotBlank(query.getName()), DataServiceAppEntity::getName, query.getName()) + .eq(DataServiceAppEntity::getIfMarket, query.getIfMarket() != null ? query.getIfMarket() : 0) + .eq(query.getIfMarket() != null, DataServiceAppEntity::getCreator, SecurityUser.getUserId()) + .eq(StringUtil.isNotBlank(query.getAppKey()), DataServiceAppEntity::getAppKey, query.getAppKey()) + .orderByDesc(DataServiceAppEntity::getCreateTime).orderByDesc(DataServiceAppEntity::getId); + return wrapper; + } } diff --git a/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java b/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java new file mode 100644 index 0000000..939f75c --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/utils/EncrypDES.java @@ -0,0 +1,145 @@ +package net.srt.utils; + +import javax.crypto.Cipher; +import java.security.Key; + +/** + * @ClassName : EncrypDES + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 09:31 + */ +public class EncrypDES { + + // 字符串默认键值 + private static String strDefaultKey = "inventec2020@#$%^&"; + + //加密工具 + private Cipher encryptCipher = null; + + // 解密工具 + private Cipher decryptCipher = null; + + /** + * 默认构造方法,使用默认密钥 + */ + public EncrypDES() throws Exception { + this(strDefaultKey); + } + + /** + * 指定密钥构造方法 + * @param strKey 指定的密钥 + * @throws Exception + */ + + public EncrypDES(String strKey) throws Exception { + + // Security.addProvider(new com.sun.crypto.provider.SunJCE()); + Key key = getKey(strKey.getBytes()); + encryptCipher = Cipher.getInstance("DES"); + encryptCipher.init(Cipher.ENCRYPT_MODE, key); + decryptCipher = Cipher.getInstance("DES"); + decryptCipher.init(Cipher.DECRYPT_MODE, key); + } + + /** + * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813,和public static byte[] + * + * hexStr2ByteArr(String strIn) 互为可逆的转换过程 + * + * @param arrB 需要转换的byte数组 + * @return 转换后的字符串 + * @throws Exception 本方法不处理任何异常,所有异常全部抛出 + */ + public static String byteArr2HexStr(byte[] arrB) throws Exception { + int iLen = arrB.length; + // 每个byte用2个字符才能表示,所以字符串的长度是数组长度的2倍 + StringBuffer sb = new StringBuffer(iLen * 2); + for (int i = 0; i < iLen; i++) { + int intTmp = arrB[i]; + // 把负数转换为正数 + while (intTmp < 0) { + intTmp = intTmp + 256; + } + // 小于0F的数需要在前面补0 + if (intTmp < 16) { + sb.append("0"); + } + sb.append(Integer.toString(intTmp, 16)); + } + return sb.toString(); + } + + /** + * 将表示16进制值的字符串转换为byte数组,和public static String byteArr2HexStr(byte[] arrB) + * 互为可逆的转换过程 + * @param strIn 需要转换的字符串 + * @return 转换后的byte数组 + */ + public static byte[] hexStr2ByteArr(String strIn) throws Exception { + byte[] arrB = strIn.getBytes(); + int iLen = arrB.length; + // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2 + byte[] arrOut = new byte[iLen / 2]; + for (int i = 0; i < iLen; i = i + 2) { + String strTmp = new String(arrB, i, 2); + arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); + } + return arrOut; + } + + /** + * + * 加密字节数组 + * @param arrB 需加密的字节数组 + * @return 加密后的字节数组 + */ + public byte[] encrypt(byte[] arrB) throws Exception { + return encryptCipher.doFinal(arrB); + } + + /** + * 加密字符串 + * @param strIn 需加密的字符串 + * @return 加密后的字符串 + */ + public String encrypt(String strIn) throws Exception { + return byteArr2HexStr(encrypt(strIn.getBytes())); + } + + /** + * 解密字节数组 + * @param arrB 需解密的字节数组 + * @return 解密后的字节数组 + */ + public byte[] decrypt(byte[] arrB) throws Exception { + return decryptCipher.doFinal(arrB); + } + + /** + * 解密字符串 + * @param strIn 需解密的字符串 + * @return 解密后的字符串 + */ + public String decrypt(String strIn) throws Exception { + return new String(decrypt(hexStr2ByteArr(strIn))); + } + + /** + * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位 + * @param arrBTmp 构成该字符串的字节数组 + * @return 生成的密钥 + */ + private Key getKey(byte[] arrBTmp) throws Exception { + // 创建一个空的8位字节数组(默认值为0) + byte[] arrB = new byte[8]; + // 将原始字节数组转换为8位 + for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { + arrB[i] = arrBTmp[i]; + } + // 生成密钥 + Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); + return key; + } +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java new file mode 100644 index 0000000..2d168e2 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiConfigVo.java @@ -0,0 +1,55 @@ +package net.srt.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** +* 数据服务-api配置 +* +* @author zrx 985134801@qq.com +* @since 1.0.0 2023-01-28 +*/ +@Data +public class ApiConfigVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long groupId; + private String path; + private String type; + private String name; + private String note; + private String sqlText; + private String sqlSeparator; + private Integer sqlMaxRow; + private String sqlParam; + private String jsonParam; + private String responseResult; + private String contentType; + private Integer status; + private Date releaseTime; + private Long releaseUserId; + private Integer sqlDbType; + private Long databaseId; + private Integer privates; + private Integer openTrans; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; + private Integer requestedTimes; + private Integer requestedSuccessTimes; + private Integer requestedFailedTimes; + private Long authId; + private String group; + private String groupPath; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java new file mode 100644 index 0000000..4193587 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ApiGroupVo.java @@ -0,0 +1,25 @@ +package net.srt.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class ApiGroupVo implements Serializable { + private static final long serialVersionUID = 1L; + private Long id; + private Long parentId; + private Integer type; + private String name; + private String description; + private Integer orderNo; + private String path; + private Long projectId; + private Integer version; + private Integer deleted; + private Long creator; + private Date createTime; + private Long updater; + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java index bd53d79..fbd3372 100644 --- a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiAuthVo.java @@ -42,6 +42,8 @@ public class DataServiceApiAuthVo implements Serializable { @Schema(description = "所属项目id") private Long projectId; + private Long authId; + @Schema(description = "版本号") private Integer version; diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java new file mode 100644 index 0000000..0c338e3 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/DataServiceApiLogVo.java @@ -0,0 +1,72 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName : DataServiceApiLog + * @Description : + * @Author : FJJ + * @Date: 2023-12-25 11:05 + */ +@Data +@Schema(description = "api请求日志") +public class DataServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java new file mode 100644 index 0000000..d79c064 --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceApiLogVo.java @@ -0,0 +1,73 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-24 15:21 + */ + +@Data +@Schema(description = "api日志") +public class ServiceApiLogVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "url") + private String url; + + @Schema(description = "响应状态码") + private Integer status; + + @Schema(description = "时长") + private Long duration; + + @Schema(description = "IP地址") + private String ip; + + @Schema(description = "app的id") + private String appId; + + @Schema(description = "api的id") + private String apiId; + + private String appName; + private String apiName; + + @Schema(description = "错误信息") + private String error; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "删除标识 0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建者") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新者") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + +} diff --git a/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java new file mode 100644 index 0000000..ce741cd --- /dev/null +++ b/srt-cloud-data-service/src/main/java/net/srt/vo/ServiceAppVo.java @@ -0,0 +1,70 @@ +package net.srt.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import net.srt.framework.common.utils.DateUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * @BelongsProject: data-center + * @BelongsPackage: net.srt.vo + * @Author: yanqiang + * @CreateTime: 2023-12-21 20:50 + */ + +@Data +@Schema(description = "数据app") +public class ServiceAppVo implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "主键id") + private Long id; + + @Schema(description = "名称") + private String name; + + @Schema(description = "备注") + private String note; + + @Schema(description = "appKey") + private String appKey; + + @Schema(description = "appSecret") + private String appSecret; + + @Schema(description = "过期时间") + private String expireDesc; + /** + * 过期时间 -1永久;0 单次失效;> 0 失效时间 + */ + private Long expireDuration; + private Integer ifMarket; + + @Schema(description = "项目id") + private Long projectId; + + @Schema(description = "版本号") + private Integer version; + + @Schema(description = "0:正常 1:已删除") + private Integer deleted; + + @Schema(description = "创建人") + private Long creator; + + @Schema(description = "创建时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date createTime; + + @Schema(description = "更新人") + private Long updater; + + @Schema(description = "更新时间") + @JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN) + private Date updateTime; + + +} diff --git a/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml new file mode 100644 index 0000000..5b1c065 --- /dev/null +++ b/srt-cloud-data-service/src/main/resources/mapper/ApiConfigDao.xml @@ -0,0 +1,87 @@ + + + + + + update data_service_api_config set auth_id=#{apiId} where id=#{id} + + + + + diff --git a/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml b/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml index 6271392..9a6fdde 100644 --- a/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml +++ b/srt-cloud-data-service/src/main/resources/mapper/DataServiceAppMapper.xml @@ -5,7 +5,7 @@ - + + +