Commit d74be380 by Jony.L

Merge remote-tracking branch 'origin/api' into develop

parents 4355cf03 401032c1
package com.luhu.computility.framework.common;
/**
* @version 1.0
* @Author ljq
* @Date 2025/4/23
* @注释
*/
public interface CustomizerHttpHeaders {
public static final String APPID = "appId";
public static final String TIMESTAMP = "timestamp";
public static final String NONCE = "nonce";
public static final String SIGN = "sign";
}
package com.luhu.computility.framework.common.exception.enums;
import com.luhu.computility.framework.common.exception.ErrorCode;
/**
* 全局错误码枚举
* 0-999 系统异常编码保留
*
* 一般情况下,使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
* 虽然说,HTTP 响应状态码作为业务使用表达能力偏弱,但是使用在系统层面还是非常不错的
* 比较特殊的是,因为之前一直使用 0 作为成功,就不使用 200 啦。
*
* @author 芋道源码
*/
public interface GlobalResponseCodeConstants {
ErrorCode SUCCESS = new ErrorCode(0, "成功");
ErrorCode EXTERNAL_SUCCESS = new ErrorCode(200, "请求成功");
// ========== 客户端错误段 ==========
ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许
ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
ErrorCode REQUEST_TIMEOUT = new ErrorCode(408, "请求超时");
ErrorCode PAYLOAD_TOO_LARGE = new ErrorCode(413, "请求体过大");
ErrorCode URI_TOO_LONG = new ErrorCode(414, "请求 URI 过长");
ErrorCode UNSUPPORTED_MEDIA_TYPE = new ErrorCode(415, "不支持的媒体类型");
ErrorCode UNPROCESSABLE_ENTITY = new ErrorCode(422, "请求无法处理");
// ========== 服务端错误段 ==========
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
ErrorCode TIME_OUT_ERROR = new ErrorCode(408, "请求超时");
ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项");
ErrorCode BAD_GATEWAY = new ErrorCode(502, "网关错误");
ErrorCode SERVICE_UNAVAILABLE = new ErrorCode(503, "服务不可用");
ErrorCode GATEWAY_TIMEOUT = new ErrorCode(504, "网关超时");
ErrorCode HTTP_VERSION_NOT_SUPPORTED = new ErrorCode(505, "不支持的 HTTP 版本");
// ========== 自定义错误段 ==========
ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求
ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作");
ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
ErrorCode IMAGE_EXCEPTION = new ErrorCode(998, "图片文件或地址必须上传一个");
ErrorCode SOURCEIMAGE_IMAGE_EXCEPTION = new ErrorCode(996, "原始图片文件或地址必传一个且仅能传一个。二选一");
ErrorCode TARGETIMAGE_IMAGE_EXCEPTION = new ErrorCode(995, "模板图片文件或地址必传一个且仅能传一个。二选一");
ErrorCode IMAGE_UNIQUE = new ErrorCode(994, "图片文件或地址只能上传一个");
ErrorCode INVALID_SERIAL_NUMBER = new ErrorCode(993, "无效的流水号");
ErrorCode BEING_GENERATED = new ErrorCode(992, "还在生成中...");
}
......@@ -174,4 +174,54 @@ public class HttpUtils {
}
}
public static String postIncludeImage(String url, Map<String, String> headers, Map<String, Object> formMaps) {
try (HttpResponse response = openApiPost(url)
.addHeaders(headers)
.form(formMaps)
//.form(fileName, file) // 上传文件,"fileName"是接口中定义的字段名
.execute()) {
return response.body();
}
}
public static HttpRequest openApiPost(String url) {
return HttpRequest.post(url)
.setReadTimeout(300000);
}
public static String get(String url, Map<String, String> headers, Map<String, String> queryParams) {
try {
// 构建查询参数字符串
StringBuilder queryBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : queryParams.entrySet()) {
if (queryBuilder.length() > 0) {
queryBuilder.append("&");
}
queryBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue());
}
// 拼接完整的 URL
String fullUrl = url;
if (queryBuilder.length() > 0) {
fullUrl += "?" + queryBuilder.toString();
}
// 发送 GET 请求并返回响应体
try (HttpResponse response = HttpRequest.get(fullUrl)
.addHeaders(headers)
.execute()) {
return response.body();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
......@@ -28,6 +28,10 @@ public abstract class AuthorizeRequestsCustomizer
return webProperties.getAppApi().getPrefix() + url;
}
protected String buildOpenApi(String url) {
return webProperties.getOpenApi().getPrefix() + url;
}
@Override
public int getOrder() {
return 0;
......
package com.luhu.computility.framework.swagger.config;
import com.luhu.computility.framework.common.CustomizerHttpHeaders;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
......@@ -152,5 +153,36 @@ public class ComputilitySwaggerAutoConfiguration {
.schema(new StringSchema()._default("Bearer test1").name(HEADER_TENANT_ID).description("认证 Token")); // 默认:使用用户编号为 1
}
public static GroupedOpenApi buildGroupedOpenApiAuthBySign(String group) {
return GroupedOpenApi.builder()
.group(group)
.pathsToMatch( "/open-api/" + group + "/**")
.addOperationCustomizer((operation, handlerMethod) -> operation
.addParametersItem(new Parameter()
.name(CustomizerHttpHeaders.APPID) // header 名
.description("应用id") // 描述
.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
.schema(new StringSchema()._default("1").name(CustomizerHttpHeaders.APPID).description("appid"))))
.addOperationCustomizer((operation, handlerMethod) -> operation
.addParametersItem(new Parameter()
.name(CustomizerHttpHeaders.NONCE) // header 名
.description("随机数,不少于10位") // 描述
.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
.schema(new StringSchema()._default("1111111111111").name(CustomizerHttpHeaders.NONCE).description("nonce"))))
.addOperationCustomizer((operation, handlerMethod) -> operation
.addParametersItem(new Parameter()
.name(CustomizerHttpHeaders.TIMESTAMP) // header 名
.description("时间戳,与服务器时间不相差10min") // 描述
.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
.schema(new StringSchema()._default("1745472001234").name(CustomizerHttpHeaders.TIMESTAMP).description("timestamp"))))
.addOperationCustomizer((operation, handlerMethod) -> operation
.addParametersItem(new Parameter()
.name(CustomizerHttpHeaders.SIGN) // header 名
.description("时间戳,与服务器时间不相差10min") // 描述
.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
.schema(new StringSchema()._default("fndjfhqofhjdsafsalfbshab").name(CustomizerHttpHeaders.SIGN).description("sign"))))
.build();
}
}
......@@ -44,6 +44,8 @@ public class ComputilityWebAutoConfiguration implements WebMvcConfigurer {
public void configurePathMatch(PathMatchConfigurer configurer) {
configurePathMatch(configurer, webProperties.getAdminApi());
configurePathMatch(configurer, webProperties.getAppApi());
configurePathMatch(configurer, webProperties.getOpenApi());
}
/**
......
......@@ -21,6 +21,9 @@ public class WebProperties {
@NotNull(message = "Admin API 不能为空")
private Api adminApi = new Api("/admin-api", "**.controller.admin.**");
@NotNull(message = "Open API 不能为空")
private Api openApi = new Api("/open-api", "**.controller.openapi.**");
@NotNull(message = "Admin UI 不能为空")
private Ui adminUi;
......
......@@ -21,7 +21,7 @@ public abstract class ApiRequestFilter extends OncePerRequestFilter {
protected boolean shouldNotFilter(HttpServletRequest request) {
// 只过滤 API 请求的地址
String apiUri = request.getRequestURI().substring(request.getContextPath().length());
return !StrUtil.startWithAny(apiUri, webProperties.getAdminApi().getPrefix(), webProperties.getAppApi().getPrefix());
return !StrUtil.startWithAny(apiUri, webProperties.getAdminApi().getPrefix(), webProperties.getAppApi().getPrefix(), webProperties.getOpenApi().getPrefix());
}
}
......@@ -115,6 +115,7 @@ public class WebFrameworkUtils {
if (request.getServletPath().startsWith(properties.getAppApi().getPrefix())) {
return UserTypeEnum.MEMBER.getValue();
}
return null;
}
......
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>computility</artifactId>
<groupId>com.luhu</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>computility-module-apihub</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>
api应用
</description>
<dependencies>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-pay</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-member</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-system</artifactId>
<version>${revision}</version>
</dependency>
<!-- 业务组件 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-biz-tenant</artifactId>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-biz-ip</artifactId>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-security</artifactId>
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-mybatis</artifactId>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-redis</artifactId>
</dependency>
<!-- Test 测试相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-test</artifactId>
</dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-excel</artifactId>
</dependency>
</dependencies>
</project>
package com.luhu.computility.module.apihub.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author LeeYan9
* @since 2022-09-15
*/
@Configuration
@EnableConfigurationProperties(ApiOrderProperties.class)
public class ApiOrderConfig {
}
package com.luhu.computility.module.apihub.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.Duration;
/**
* 交易订单的配置项
*
* @author ljq
* @since 2025-09-07
*/
@ConfigurationProperties(prefix = "computility.api.order")
@Data
@Validated
public class ApiOrderProperties {
private static final String PAY_APP_KEY_DEFAULT = "apimall";
/**
* 支付应用标识
*
* 在 pay 模块的 [支付管理 -> 应用信息]
*/
@NotEmpty(message = "Pay 应用标识不能为空")
private String payAppKey = PAY_APP_KEY_DEFAULT;
/**
* 支付超时时间
*/
@NotNull(message = "支付超时时间不能为空")
private Duration payExpireTime;
/**
* 收货超时时间
*/
@NotNull(message = "收货超时时间不能为空")
private Duration receiveExpireTime;
/**
* 评论超时时间
*/
@NotNull(message = "评论超时时间不能为空")
private Duration commentExpireTime;
/**
* 是否同步订单状态到微信小程序
*/
@NotNull(message = "是否同步订单状态到微信小程序不能为空")
private Boolean statusSyncToWxaEnable;
}
package com.luhu.computility.module.apihub.controller.admin.api;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.ApiEndpointRespVO;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.ApiEndpointSaveReqVO;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.ApiEndpointRelPageReqVO;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.ApiEndpointRelSaveReqVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageRespVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageSaveReqVO;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel.ApiEndpointRelDO;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import com.luhu.computility.module.apihub.service.apiendpoint.ApiEndpointService;
import com.luhu.computility.module.apihub.service.apiendpointrel.ApiEndpointRelService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import org.checkerframework.checker.units.qual.A;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.api.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.service.api.ApiService;
@Tag(name = "管理后台 - API信息")
@RestController
@RequestMapping("/apihub/api")
@Validated
public class ApiController {
@Resource
private ApiService apiService;
@Resource
private ApiEndpointRelService apiEndpointRelService;
@Resource
private ApiPackageService apiPackageService;
@PostMapping("/create")
@Operation(summary = "创建API信息")
@Transactional(rollbackFor = Exception.class)
public CommonResult<Long> createApi(@Valid @RequestBody ApiSaveReqVO createReqVO) {
Long apiId = apiService.createApi(createReqVO);
//创建套餐包
if (!CollectionUtil.isEmpty(createReqVO.getApiPackages())) {
for (ApiPackageSaveReqVO apiPackageSaveReqVO : createReqVO.getApiPackages()) {
apiPackageSaveReqVO.setApiId(apiId);
apiPackageService.createApiPackage(apiPackageSaveReqVO);
}
}
//api应用+api接口关联
if (!CollectionUtil.isEmpty(createReqVO.getApiEndPoints())) {
for (ApiEndpointSaveReqVO apiEndpointSaveReqVO : createReqVO.getApiEndPoints()) {
apiEndpointRelService.createApiEndpointRel(new ApiEndpointRelSaveReqVO()
.setApiEndpointId(apiEndpointSaveReqVO.getId())
.setApiId(apiId));
}
}
return success(apiId);
}
@PutMapping("/update")
@Operation(summary = "更新API信息")
//@PreAuthorize("@ss.hasPermission('apihub:api:update')")
@Transactional(rollbackFor = Exception.class)
public CommonResult<Boolean> updateApi(@Valid @RequestBody ApiSaveReqVO updateReqVO) {
//有套餐则更新套餐
if (!CollectionUtil.isEmpty(updateReqVO.getApiPackages())) {
for (ApiPackageSaveReqVO apiPackageSaveReqVO : updateReqVO.getApiPackages()) {
if (ObjectUtil.isEmpty(apiPackageSaveReqVO.getId())) {
apiPackageSaveReqVO.setApiId(updateReqVO.getId());
apiPackageService.createApiPackage(apiPackageSaveReqVO);
} else {
apiPackageService.updateApiPackage(BeanUtils.toBean(apiPackageSaveReqVO,ApiPackageSaveReqVO.class));
}
}
}
if (!CollectionUtil.isEmpty(updateReqVO.getApiEndPoints())) {
//删除已经关联的
apiEndpointRelService.deleteByApiId(updateReqVO.getId());
for (ApiEndpointSaveReqVO apiEndpointSaveReqVO : updateReqVO.getApiEndPoints()) {
apiEndpointRelService.createApiEndpointRel(new ApiEndpointRelSaveReqVO()
.setApiEndpointId(apiEndpointSaveReqVO.getId())
.setApiId(updateReqVO.getId()));
}
}
apiService.updateApi(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api:delete')")
public CommonResult<Boolean> deleteApi(@RequestParam("id") Long id) {
apiService.deleteApi(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API信息")
@PreAuthorize("@ss.hasPermission('apihub:api:delete')")
public CommonResult<Boolean> deleteApiList(@RequestParam("ids") List<Long> ids) {
apiService.deleteApiListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api:query')")
public CommonResult<ApiRespVO> getApi(@RequestParam("id") Long id) {
ApiDO api = apiService.getApi(id);
ApiRespVO apiRespVO = BeanUtils.toBean(api, ApiRespVO.class);
List<ApiPackageDO> apiPackageDOS = apiPackageService.selectByApiId(id);
apiRespVO.setApiPackages(BeanUtils.toBean(apiPackageDOS, ApiPackageRespVO.class));
List<ApiEndpointRespVO> apiEndpointRespVOS = apiEndpointRelService.getApiEndpointByApiId(id);
apiRespVO.setApiEndPoints(apiEndpointRespVOS);
return success(apiRespVO);
}
@GetMapping("/page")
@Operation(summary = "获得API信息分页")
public CommonResult<PageResult<ApiRespVO>> getApiPage(@Valid ApiPageReqVO pageReqVO) {
return success(apiService.getApiPage(pageReqVO));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API信息 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiExcel(@Valid ApiPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiRespVO> list = apiService.getApiPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API信息.xls", "数据", ApiRespVO.class,
BeanUtils.toBean(list, ApiRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.api.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API信息分页 Request VO")
@Data
public class ApiPageReqVO extends PageParam {
@Schema(description = "API 名称", example = "李四")
private String name;
@Schema(description = "状态:1=上架,0=下架", example = "1")
private Integer status;
@Schema(description = "API 分类", example = "4891084201")
@ExcelProperty("API 分类")
private Long categoryId;
@Schema(description = "关键字查找", example = "通用型API")
@ExcelProperty("关键字查找")
private String searchQuery;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.api.vo;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.ApiEndpointRespVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageRespVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiRespVO {
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11243")
@ExcelProperty("API ID")
private Long id;
@Schema(description = "API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@ExcelProperty("API 名称")
private String name;
@Schema(description = "API 简介", example = "你说的对")
@ExcelProperty("API 简介")
private String description;
@Schema(description = "API 最低价格描述", example = "你说的对")
@ExcelProperty("API 最低价格描述")
private String priceInfo;
@Schema(description = "API coverimage", example = "https://xxx.png")
@ExcelProperty("API coverimage")
private String coverImage;
@Schema(description = "API 分类", example = "4891084201")
@ExcelProperty("API 分类")
private Long categoryId;
@Schema(description = "API 分类名称", example = "通用api")
@ExcelProperty("API 分类名称")
private String categoryName;
@Schema(description = "API 详细介绍")
@ExcelProperty("API 详细介绍")
private String detail;
@Schema(description = "接口文档内容")
@ExcelProperty("接口文档内容")
private String doc;
@Schema(description = "状态:1=上架,0=下架", example = "1")
@ExcelProperty("状态:1=上架,0=下架")
private Integer status;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "资源包", example = "[{}]")
private List<ApiPackageRespVO> apiPackages;
@Schema(description = "", example = "[{}]")
private List<ApiEndpointRespVO> apiEndPoints;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.api.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.ApiEndpointSaveReqVO;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.ApiEndpointRelRespVO;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.ApiEndpointRelSaveReqVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageSaveReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - API信息新增/修改 Request VO")
@Data
public class ApiSaveReqVO {
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11243")
private Long id;
@Schema(description = "API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@NotEmpty(message = "API 名称不能为空")
private String name;
@Schema(description = "API 简介", example = "你说的对")
private String description;
@Schema(description = "API 最低价格描述", example = "你说的对")
private String priceInfo;
@Schema(description = "API coverimage", example = "https://xxx.png")
private String coverImage;
@Schema(description = "API 分类")
private Long categoryId;
@Schema(description = "API 详细介绍")
private String detail;
@Schema(description = "接口文档内容")
private String doc;
@Schema(description = "状态:1=上架,0=下架", example = "1")
private Integer status;
@Schema(description = "备注", example = "随便")
private String remark;
@Schema(description = "资源包", example = "随便")
private List<ApiPackageSaveReqVO> apiPackages;
@Schema(description = "api接口", example = "随便")
private List<ApiEndpointSaveReqVO> apiEndPoints;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicalllog;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apicalllog.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicalllog.ApiCallLogDO;
import com.luhu.computility.module.apihub.service.apicalllog.ApiCallLogService;
@Tag(name = "管理后台 - API 调用日志")
@RestController
@RequestMapping("/apihub/api-call-log")
@Validated
public class ApiCallLogController {
@Resource
private ApiCallLogService apiCallLogService;
@PostMapping("/create")
@Operation(summary = "创建API 调用日志")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:create')")
public CommonResult<Long> createApiCallLog(@Valid @RequestBody ApiCallLogSaveReqVO createReqVO) {
return success(apiCallLogService.createApiCallLog(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新API 调用日志")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:update')")
public CommonResult<Boolean> updateApiCallLog(@Valid @RequestBody ApiCallLogSaveReqVO updateReqVO) {
apiCallLogService.updateApiCallLog(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API 调用日志")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:delete')")
public CommonResult<Boolean> deleteApiCallLog(@RequestParam("id") Long id) {
apiCallLogService.deleteApiCallLog(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API 调用日志")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:delete')")
public CommonResult<Boolean> deleteApiCallLogList(@RequestParam("ids") List<Long> ids) {
apiCallLogService.deleteApiCallLogListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API 调用日志")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:query')")
public CommonResult<ApiCallLogRespVO> getApiCallLog(@RequestParam("id") Long id) {
ApiCallLogDO apiCallLog = apiCallLogService.getApiCallLog(id);
return success(BeanUtils.toBean(apiCallLog, ApiCallLogRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得API 调用日志分页")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:query')")
public CommonResult<PageResult<ApiCallLogRespVO>> getApiCallLogPage(@Valid ApiCallLogPageReqVO pageReqVO) {
PageResult<ApiCallLogDO> pageResult = apiCallLogService.getApiCallLogPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiCallLogRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API 调用日志 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-call-log:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiCallLogExcel(@Valid ApiCallLogPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiCallLogDO> list = apiCallLogService.getApiCallLogPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API 调用日志.xls", "数据", ApiCallLogRespVO.class,
BeanUtils.toBean(list, ApiCallLogRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicalllog.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API 调用日志分页 Request VO")
@Data
public class ApiCallLogPageReqVO extends PageParam {
@Schema(description = "调用用户ID", example = "25965")
private Long userId;
@Schema(description = "调用的API ID", example = "11672")
private Long apiId;
@Schema(description = "响应状态(如200, 500等)", example = "2")
private String responseStatus;
@Schema(description = "调用时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] callTime;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicalllog.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API 调用日志 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiCallLogRespVO {
@Schema(description = "调用日志ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8682")
@ExcelProperty("调用日志ID")
private Long id;
@Schema(description = "调用用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "25965")
@ExcelProperty("调用用户ID")
private Long userId;
@Schema(description = "调用的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11672")
@ExcelProperty("调用的API ID")
private Long apiId;
@Schema(description = "请求参数")
@ExcelProperty("请求参数")
private String requestParams;
@Schema(description = "响应状态(如200, 500等)", example = "2")
@ExcelProperty("响应状态(如200, 500等)")
private String responseStatus;
@Schema(description = "调用时间")
@ExcelProperty("调用时间")
private LocalDateTime callTime;
@Schema(description = "备注", example = "你猜")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicalllog.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - API 调用日志新增/修改 Request VO")
@Data
public class ApiCallLogSaveReqVO {
@Schema(description = "调用日志ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8682")
private Long id;
@Schema(description = "调用用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "25965")
@NotNull(message = "调用用户ID不能为空")
private Long userId;
@Schema(description = "调用的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11672")
@NotNull(message = "调用的API ID不能为空")
private Long apiId;
@Schema(description = "请求参数")
private String requestParams;
@Schema(description = "响应状态(如200, 500等)", example = "2")
private String responseStatus;
@Schema(description = "调用时间")
private LocalDateTime callTime;
@Schema(description = "备注", example = "你猜")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicategory;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.service.apicategory.ApiCategoryService;
@Tag(name = "管理后台 - API分类")
@RestController
@RequestMapping("/apihub/api-category")
@Validated
public class ApiCategoryController {
@Resource
private ApiCategoryService apiCategoryService;
@PostMapping("/create")
@Operation(summary = "创建API分类")
@PreAuthorize("@ss.hasPermission('apihub:api-category:create')")
public CommonResult<Long> createApiCategory(@Valid @RequestBody ApiCategorySaveReqVO createReqVO) {
return success(apiCategoryService.createApiCategory(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新API分类")
@PreAuthorize("@ss.hasPermission('apihub:api-category:update')")
public CommonResult<Boolean> updateApiCategory(@Valid @RequestBody ApiCategorySaveReqVO updateReqVO) {
apiCategoryService.updateApiCategory(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API分类")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-category:delete')")
public CommonResult<Boolean> deleteApiCategory(@RequestParam("id") Long id) {
apiCategoryService.deleteApiCategory(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API分类")
@PreAuthorize("@ss.hasPermission('apihub:api-category:delete')")
public CommonResult<Boolean> deleteApiCategoryList(@RequestParam("ids") List<Long> ids) {
apiCategoryService.deleteApiCategoryListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API分类")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-category:query')")
public CommonResult<ApiCategoryRespVO> getApiCategory(@RequestParam("id") Long id) {
ApiCategoryDO apiCategory = apiCategoryService.getApiCategory(id);
return success(BeanUtils.toBean(apiCategory, ApiCategoryRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得API分类分页")
@PreAuthorize("@ss.hasPermission('apihub:api-category:query')")
public CommonResult<PageResult<ApiCategoryRespVO>> getApiCategoryPage(@Valid ApiCategoryPageReqVO pageReqVO) {
PageResult<ApiCategoryDO> pageResult = apiCategoryService.getApiCategoryPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiCategoryRespVO.class));
}
@GetMapping("/list")
@Operation(summary = "获得API所有分类")
public CommonResult<List<ApiCategoryRespVO>> getAllApiCategory() {
List<ApiCategoryDO> apiCategoryDOS = apiCategoryService.getAllApiCategory();
return success(BeanUtils.toBean(apiCategoryDOS, ApiCategoryRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API分类 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-category:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiCategoryExcel(@Valid ApiCategoryPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiCategoryDO> list = apiCategoryService.getApiCategoryPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API分类.xls", "数据", ApiCategoryRespVO.class,
BeanUtils.toBean(list, ApiCategoryRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicategory.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API分类分页 Request VO")
@Data
public class ApiCategoryPageReqVO extends PageParam {
@Schema(description = "分类名称", example = "张三")
private String name;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API分类 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiCategoryRespVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4302")
@ExcelProperty("ID")
private Long id;
@Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@ExcelProperty("分类名称")
private String name;
@Schema(description = "分类简介", example = "你说的对")
@ExcelProperty("分类简介")
private String description;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apicategory.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - API分类新增/修改 Request VO")
@Data
public class ApiCategorySaveReqVO {
@Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4302")
private Long id;
@Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@NotEmpty(message = "分类名称不能为空")
private String name;
@Schema(description = "分类简介", example = "你说的对")
private String description;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpoint;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpoint.ApiEndpointDO;
import com.luhu.computility.module.apihub.service.apiendpoint.ApiEndpointService;
@Tag(name = "管理后台 - API 接口")
@RestController
@RequestMapping("/apihub/api-endpoint")
@Validated
public class ApiEndpointController {
@Resource
private ApiEndpointService apiEndpointService;
@PostMapping("/create")
@Operation(summary = "创建API 接口")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:create')")
public CommonResult<Long> createApiEndpoint(@Valid @RequestBody ApiEndpointSaveReqVO createReqVO) {
return success(apiEndpointService.createApiEndpoint(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新API 接口")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:update')")
public CommonResult<Boolean> updateApiEndpoint(@Valid @RequestBody ApiEndpointSaveReqVO updateReqVO) {
apiEndpointService.updateApiEndpoint(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API 接口")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:delete')")
public CommonResult<Boolean> deleteApiEndpoint(@RequestParam("id") Long id) {
apiEndpointService.deleteApiEndpoint(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API 接口")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:delete')")
public CommonResult<Boolean> deleteApiEndpointList(@RequestParam("ids") List<Long> ids) {
apiEndpointService.deleteApiEndpointListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API 接口")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:query')")
public CommonResult<ApiEndpointRespVO> getApiEndpoint(@RequestParam("id") Long id) {
ApiEndpointDO apiEndpoint = apiEndpointService.getApiEndpoint(id);
return success(BeanUtils.toBean(apiEndpoint, ApiEndpointRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得API 接口分页")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:query')")
public CommonResult<PageResult<ApiEndpointRespVO>> getApiEndpointPage(@Valid ApiEndpointPageReqVO pageReqVO) {
PageResult<ApiEndpointDO> pageResult = apiEndpointService.getApiEndpointPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiEndpointRespVO.class));
}
@GetMapping("/list")
@Operation(summary = "获得API 接口")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:query')")
public CommonResult<List<ApiEndpointRespVO>> getApiEndpointPage() {
List<ApiEndpointDO> pageResult = apiEndpointService.getApiEndpointList();
return success(BeanUtils.toBean(pageResult, ApiEndpointRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API 接口 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiEndpointExcel(@Valid ApiEndpointPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiEndpointDO> list = apiEndpointService.getApiEndpointPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API 接口.xls", "数据", ApiEndpointRespVO.class,
BeanUtils.toBean(list, ApiEndpointRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API 接口分页 Request VO")
@Data
public class ApiEndpointPageReqVO extends PageParam {
@Schema(description = "接口名称", example = "王五")
private String name;
@Schema(description = "接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx")
private String path;
@Schema(description = "请求方式: GET/POST/PUT/DELETE")
private String method;
@Schema(description = "参数定义(JSON)")
private String params;
@Schema(description = "返回结果示例")
private String response;
@Schema(description = "鉴权方式,例如 API_KEY/OAUTH", example = "2")
private String authType;
@Schema(description = "接口级限流规则,例如 100 QPS")
private String rateLimit;
@Schema(description = "备注", example = "你说的对")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API 接口 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiEndpointRespVO {
@Schema(description = "接口ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30761")
@ExcelProperty("接口ID")
private Long id;
@Schema(description = "接口名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@ExcelProperty("接口名称")
private String name;
@Schema(description = "接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx")
private String path;
@Schema(description = "请求方式: GET/POST/PUT/DELETE", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("请求方式: GET/POST/PUT/DELETE")
private String method;
@Schema(description = "参数定义(JSON)")
@ExcelProperty("参数定义(JSON)")
private String params;
@Schema(description = "返回结果示例")
@ExcelProperty("返回结果示例")
private String response;
@Schema(description = "鉴权方式,例如 API_KEY/OAUTH", example = "2")
@ExcelProperty("鉴权方式,例如 API_KEY/OAUTH")
private String authType;
@Schema(description = "接口级限流规则,例如 100 QPS")
@ExcelProperty("接口级限流规则,例如 100 QPS")
private String rateLimit;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - API 接口新增/修改 Request VO")
@Data
public class ApiEndpointSaveReqVO {
@Schema(description = "接口ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30761")
private Long id;
@Schema(description = "接口名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
@NotEmpty(message = "接口名称不能为空")
private String name;
@Schema(description = "接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx不能为空")
private String path;
@Schema(description = "请求方式: GET/POST/PUT/DELETE", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "请求方式: GET/POST/PUT/DELETE不能为空")
private String method;
@Schema(description = "参数定义(JSON)")
private String params;
@Schema(description = "返回结果示例")
private String response;
@Schema(description = "鉴权方式,例如 API_KEY/OAUTH", example = "2")
private String authType;
@Schema(description = "接口级限流规则,例如 100 QPS")
private String rateLimit;
@Schema(description = "备注", example = "你说的对")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpointrel;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel.ApiEndpointRelDO;
import com.luhu.computility.module.apihub.service.apiendpointrel.ApiEndpointRelService;
@Tag(name = "管理后台 - API 应用与接口关系")
@RestController
@RequestMapping("/apihub/api-endpoint-rel")
@Validated
public class ApiEndpointRelController {
@Resource
private ApiEndpointRelService apiEndpointRelService;
@PostMapping("/create")
@Operation(summary = "创建API 应用与接口关系")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:create')")
public CommonResult<Long> createApiEndpointRel(@Valid @RequestBody ApiEndpointRelSaveReqVO createReqVO) {
return success(apiEndpointRelService.createApiEndpointRel(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新API 应用与接口关系")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:update')")
public CommonResult<Boolean> updateApiEndpointRel(@Valid @RequestBody ApiEndpointRelSaveReqVO updateReqVO) {
apiEndpointRelService.updateApiEndpointRel(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API 应用与接口关系")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:delete')")
public CommonResult<Boolean> deleteApiEndpointRel(@RequestParam("id") Long id) {
apiEndpointRelService.deleteApiEndpointRel(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API 应用与接口关系")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:delete')")
public CommonResult<Boolean> deleteApiEndpointRelList(@RequestParam("ids") List<Long> ids) {
apiEndpointRelService.deleteApiEndpointRelListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API 应用与接口关系")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:query')")
public CommonResult<ApiEndpointRelRespVO> getApiEndpointRel(@RequestParam("id") Long id) {
ApiEndpointRelDO apiEndpointRel = apiEndpointRelService.getApiEndpointRel(id);
return success(BeanUtils.toBean(apiEndpointRel, ApiEndpointRelRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得API 应用与接口关系分页")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:query')")
public CommonResult<PageResult<ApiEndpointRelRespVO>> getApiEndpointRelPage(@Valid ApiEndpointRelPageReqVO pageReqVO) {
PageResult<ApiEndpointRelDO> pageResult = apiEndpointRelService.getApiEndpointRelPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiEndpointRelRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API 应用与接口关系 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-endpoint-rel:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiEndpointRelExcel(@Valid ApiEndpointRelPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiEndpointRelDO> list = apiEndpointRelService.getApiEndpointRelPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API 应用与接口关系.xls", "数据", ApiEndpointRelRespVO.class,
BeanUtils.toBean(list, ApiEndpointRelRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API 应用与接口关系分页 Request VO")
@Data
public class ApiEndpointRelPageReqVO extends PageParam {
@Schema(description = "API 应用ID,关联 apihub_api.id", example = "15662")
private Long apiId;
@Schema(description = "接口ID,关联 apihub_api_endpoint.id", example = "14690")
private Long apiEndpointId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API 应用与接口关系 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiEndpointRelRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30202")
@ExcelProperty("主键")
private Long id;
@Schema(description = "API 应用ID,关联 apihub_api.id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15662")
@ExcelProperty("API 应用ID,关联 apihub_api.id")
private Long apiId;
@Schema(description = "接口ID,关联 apihub_api_endpoint.id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14690")
@ExcelProperty("接口ID,关联 apihub_api_endpoint.id")
private Long apiEndpointId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - API 应用与接口关系新增/修改 Request VO")
@Data
public class ApiEndpointRelSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30202")
private Long id;
@Schema(description = "API 应用ID,关联 apihub_api.id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15662")
@NotNull(message = "API 应用ID,关联 apihub_api.id不能为空")
private Long apiId;
@Schema(description = "接口ID,关联 apihub_api_endpoint.id", requiredMode = Schema.RequiredMode.REQUIRED, example = "14690")
@NotNull(message = "接口ID,关联 apihub_api_endpoint.id不能为空")
private Long apiEndpointId;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiorder;
import cn.hutool.core.date.DateUtil;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.UserApiUsageSaveReqVO;
import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService;
import com.luhu.computility.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
@Tag(name = "管理后台 - api订单")
@RestController
@RequestMapping("/apihub/api-order")
@Validated
@Slf4j
public class ApiOrderController {
@Resource
private ApiOrderService apiOrderService;
@Resource
private UserApiUsageService userApiUsageService;
@PostMapping("/create")
@Operation(summary = "创建api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:create')")
public CommonResult<Long> createApiOrder(@Valid @RequestBody ApiOrderSaveReqVO createReqVO) {
return success(apiOrderService.createApiOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:update')")
public CommonResult<Boolean> updateApiOrder(@Valid @RequestBody ApiOrderSaveReqVO updateReqVO) {
apiOrderService.updateApiOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除api订单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-order:delete')")
public CommonResult<Boolean> deleteApiOrder(@RequestParam("id") Long id) {
apiOrderService.deleteApiOrder(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:delete')")
public CommonResult<Boolean> deleteApiOrderList(@RequestParam("ids") List<Long> ids) {
apiOrderService.deleteApiOrderListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得api订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-order:query')")
public CommonResult<ApiOrderRespVO> getApiOrder(@RequestParam("id") Long id) {
ApiOrderDO apiOrder = apiOrderService.getApiOrder(id);
return success(BeanUtils.toBean(apiOrder, ApiOrderRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得api订单分页")
@PreAuthorize("@ss.hasPermission('apihub:api-order:query')")
public CommonResult<PageResult<ApiOrderRespVO>> getApiOrderPage(@Valid ApiOrderPageReqVO pageReqVO) {
PageResult<ApiOrderDO> pageResult = apiOrderService.getApiOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiOrderRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出api订单 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiOrderExcel(@Valid ApiOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiOrderDO> list = apiOrderService.getApiOrderPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "api订单.xls", "数据", ApiOrderRespVO.class,
BeanUtils.toBean(list, ApiOrderRespVO.class));
}
/**
* 内部支付任务回调
*/
@PostMapping("/update-paid")
@PermitAll
public CommonResult<Boolean> updateApiOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) {
apiOrderService.updateApiOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayOrderId());
log.error("更新Api订单为已支付------------" + notifyReqDTO.getMerchantOrderId());
ApiOrderDO apiOrder = apiOrderService.getApiOrder(Long.parseLong(notifyReqDTO.getMerchantOrderId()));
userApiUsageService.createUserApiUsage(
new UserApiUsageSaveReqVO().setApiId(apiOrder.getApiId())
.setApiName(apiOrder.getApiName())
.setPackageId(apiOrder.getPackageId())
.setPackageName(apiOrder.getPackageName())
.setPackageTimes(apiOrder.getPackageTimes())
.setPackageValidDays(apiOrder.getPackageValidDays())
.setUserId(apiOrder.getUserId())
.setExpireTime(DateUtil.offsetDay(new Date(), apiOrder.getPackageTimes()).toLocalDateTime() )
.setPackagePrice(apiOrder.getPackagePrice())
);
log.error("创建用户Api资源包数据------------" + notifyReqDTO.getMerchantOrderId());
log.error("内部支付任务回调 ");
return success(true);
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiorder.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - api订单分页 Request VO")
@Data
public class ApiOrderPageReqVO extends PageParam {
@Schema(description = "下单用户ID", example = "3895")
private Long userId;
@Schema(description = "购买的API ID", example = "10347")
private Long apiId;
@Schema(description = "购买的套餐ID", example = "8957")
private Long packageId;
@Schema(description = "订单编号")
private String orderNo;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
private Long payOrderId;
@Schema(description = "订单支付时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] payTime;
@Schema(description = "支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - api订单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiOrderRespVO {
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30231")
@ExcelProperty("订单ID")
private Long id;
@Schema(description = "下单用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3895")
@ExcelProperty("下单用户ID")
private Long userId;
@Schema(description = "购买的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@ExcelProperty("购买的API ID")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号")
private String orderNo;
@Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单实际支付金额(分)")
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
@ExcelProperty("支付订单编号")
private Long payOrderId;
@Schema(description = "订单支付时间")
@ExcelProperty("订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付成功的支付渠道")
@ExcelProperty("支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "订单完成时间")
@ExcelProperty("订单完成时间")
private LocalDateTime finishTime;
@Schema(description = "订单取消时间")
@ExcelProperty("订单取消时间")
private LocalDateTime cancelTime;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - api订单新增/修改 Request VO")
@Data
public class ApiOrderSaveReqVO {
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30231")
private Long id;
@Schema(description = "下单用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3895")
@NotNull(message = "下单用户ID不能为空")
private Long userId;
@Schema(description = "购买的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@NotNull(message = "购买的API ID不能为空")
private Long apiId;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@NotNull(message = "购买的套餐ID不能为空")
private Long packageId;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "订单编号不能为空")
private String orderNo;
@Schema(description = "订单实际支付金额(分)", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "订单实际支付金额(分)不能为空")
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
private Long payOrderId;
@Schema(description = "订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "订单完成时间")
private LocalDateTime finishTime;
@Schema(description = "订单取消时间")
private LocalDateTime cancelTime;
@Schema(description = "备注", example = "你说的对")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apipackage;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
@Tag(name = "管理后台 - API 套餐")
@RestController
@RequestMapping("/apihub/api-package")
@Validated
public class ApiPackageController {
@Resource
private ApiPackageService apiPackageService;
@PostMapping("/create")
@Operation(summary = "创建API 套餐")
@PreAuthorize("@ss.hasPermission('apihub:api-package:create')")
public CommonResult<Long> createApiPackage(@Valid @RequestBody ApiPackageSaveReqVO createReqVO) {
return success(apiPackageService.createApiPackage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新API 套餐")
@PreAuthorize("@ss.hasPermission('apihub:api-package:update')")
public CommonResult<Boolean> updateApiPackage(@Valid @RequestBody ApiPackageSaveReqVO updateReqVO) {
apiPackageService.updateApiPackage(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除API 套餐")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-package:delete')")
public CommonResult<Boolean> deleteApiPackage(@RequestParam("id") Long id) {
apiPackageService.deleteApiPackage(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除API 套餐")
@PreAuthorize("@ss.hasPermission('apihub:api-package:delete')")
public CommonResult<Boolean> deleteApiPackageList(@RequestParam("ids") List<Long> ids) {
apiPackageService.deleteApiPackageListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得API 套餐")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-package:query')")
public CommonResult<ApiPackageRespVO> getApiPackage(@RequestParam("id") Long id) {
ApiPackageDO apiPackage = apiPackageService.getApiPackage(id);
return success(BeanUtils.toBean(apiPackage, ApiPackageRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得API 套餐分页")
@PreAuthorize("@ss.hasPermission('apihub:api-package:query')")
public CommonResult<PageResult<ApiPackageRespVO>> getApiPackagePage(@Valid ApiPackagePageReqVO pageReqVO) {
PageResult<ApiPackageDO> pageResult = apiPackageService.getApiPackagePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ApiPackageRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API 套餐 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-package:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiPackageExcel(@Valid ApiPackagePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiPackageDO> list = apiPackageService.getApiPackagePage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API 套餐.xls", "数据", ApiPackageRespVO.class,
BeanUtils.toBean(list, ApiPackageRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apipackage.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - API 套餐分页 Request VO")
@Data
public class ApiPackagePageReqVO extends PageParam {
@Schema(description = "关联的API ID", example = "23999")
private Long apiId;
@Schema(description = "套餐名称", example = "芋艿")
private String name;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apipackage.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - API 套餐 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ApiPackageRespVO {
@Schema(description = "套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1592")
@ExcelProperty("套餐ID")
private Long id;
@Schema(description = "关联的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23999")
@ExcelProperty("关联的API ID")
private Long apiId;
@Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("套餐名称")
private String name;
@Schema(description = "可调用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("可调用次数")
private Integer times;
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@ExcelProperty("价格(元)")
private Integer price;
@Schema(description = "有效期(天),0表示永久有效")
@ExcelProperty("有效期(天),0表示永久有效")
private Integer validDays;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apipackage.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.math.BigDecimal;
@Schema(description = "管理后台 - API 套餐新增/修改 Request VO")
@Data
public class ApiPackageSaveReqVO {
@Schema(description = "套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1592")
private Long id;
@Schema(description = "关联的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23999")
private Long apiId;
@Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@NotEmpty(message = "套餐名称不能为空")
private String name;
@Schema(description = "可调用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "可调用次数不能为空")
private Integer times;
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@NotNull(message = "价格(元)不能为空")
private Integer price;
@Schema(description = "有效期(天),0表示永久有效")
private Integer validDays;
@Schema(description = "有效期(天),0表示永久有效")
private Boolean status;
@Schema(description = "备注", example = "随便")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.appcredential;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.appcredential.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.appcredential.AppCredentialDO;
import com.luhu.computility.module.apihub.service.appcredential.AppCredentialService;
@Tag(name = "管理后台 - 用户密钥信息")
@RestController
@RequestMapping("/apihub/app-credential")
@Validated
public class AppCredentialController {
@Resource
private AppCredentialService appCredentialService;
@PostMapping("/create")
@Operation(summary = "创建用户密钥信息")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:create')")
public CommonResult<Long> createAppCredential(@Valid @RequestBody AppCredentialSaveReqVO createReqVO) {
return success(appCredentialService.createAppCredential(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新用户密钥信息")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:update')")
public CommonResult<Boolean> updateAppCredential(@Valid @RequestBody AppCredentialSaveReqVO updateReqVO) {
appCredentialService.updateAppCredential(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除用户密钥信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:app-credential:delete')")
public CommonResult<Boolean> deleteAppCredential(@RequestParam("id") Long id) {
appCredentialService.deleteAppCredential(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除用户密钥信息")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:delete')")
public CommonResult<Boolean> deleteAppCredentialList(@RequestParam("ids") List<Long> ids) {
appCredentialService.deleteAppCredentialListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得用户密钥信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:query')")
public CommonResult<AppCredentialRespVO> getAppCredential(@RequestParam("id") Long id) {
AppCredentialDO appCredential = appCredentialService.getAppCredential(id);
return success(BeanUtils.toBean(appCredential, AppCredentialRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得用户密钥信息分页")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:query')")
public CommonResult<PageResult<AppCredentialRespVO>> getAppCredentialPage(@Valid AppCredentialPageReqVO pageReqVO) {
PageResult<AppCredentialDO> pageResult = appCredentialService.getAppCredentialPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AppCredentialRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出用户密钥信息 Excel")
@PreAuthorize("@ss.hasPermission('apihub:app-credential:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportAppCredentialExcel(@Valid AppCredentialPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AppCredentialDO> list = appCredentialService.getAppCredentialPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "用户密钥信息.xls", "数据", AppCredentialRespVO.class,
BeanUtils.toBean(list, AppCredentialRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.appcredential.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 用户密钥信息分页 Request VO")
@Data
public class AppCredentialPageReqVO extends PageParam {
@Schema(description = "应用ID,唯一", example = "23068")
private String appId;
@Schema(description = "AES加密后的应用密钥")
private String appSecret;
@Schema(description = "所属用户ID", example = "11786")
private Long userId;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.appcredential.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 用户密钥信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppCredentialRespVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8721")
@ExcelProperty("主键ID")
private Long id;
@Schema(description = "应用ID,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "23068")
@ExcelProperty("应用ID,唯一")
private String appId;
@Schema(description = "AES加密后的应用密钥", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("AES加密后的应用密钥")
private String appSecret;
@Schema(description = "所属用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11786")
@ExcelProperty("所属用户ID")
private Long userId;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.appcredential.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 用户密钥信息新增/修改 Request VO")
@Data
public class AppCredentialSaveReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8721")
private Long id;
@Schema(description = "应用ID,唯一", requiredMode = Schema.RequiredMode.REQUIRED, example = "23068")
@NotEmpty(message = "应用ID,唯一不能为空")
private String appId;
@Schema(description = "AES加密后的应用密钥", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "AES加密后的应用密钥不能为空")
private String appSecret;
@Schema(description = "所属用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11786")
@NotNull(message = "所属用户ID不能为空")
private Long userId;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.userapiusage;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.*;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.apihub.service.userapiusage.UserApiUsageService;
@Tag(name = "管理后台 - 用户API管理")
@RestController
@RequestMapping("/apihub/user-api-usage")
@Validated
public class UserApiUsageController {
@Resource
private UserApiUsageService userApiUsageService;
@PostMapping("/create")
@Operation(summary = "创建用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:create')")
public CommonResult<Long> createUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO createReqVO) {
return success(userApiUsageService.createUserApiUsage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:update')")
public CommonResult<Boolean> updateUserApiUsage(@Valid @RequestBody UserApiUsageSaveReqVO updateReqVO) {
userApiUsageService.updateUserApiUsage(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除用户API管理")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsage(@RequestParam("id") Long id) {
userApiUsageService.deleteUserApiUsage(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除用户API管理")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:delete')")
public CommonResult<Boolean> deleteUserApiUsageList(@RequestParam("ids") List<Long> ids) {
userApiUsageService.deleteUserApiUsageListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得用户API管理")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<UserApiUsageRespVO> getUserApiUsage(@RequestParam("id") Long id) {
UserApiUsageDO userApiUsage = userApiUsageService.getUserApiUsage(id);
return success(BeanUtils.toBean(userApiUsage, UserApiUsageRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得用户API管理分页")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:query')")
public CommonResult<PageResult<UserApiUsageRespVO>> getUserApiUsagePage(@Valid UserApiUsagePageReqVO pageReqVO) {
return success(userApiUsageService.getUserApiUsagePage(pageReqVO));
}
@GetMapping("/export-excel")
@Operation(summary = "导出用户API管理 Excel")
@PreAuthorize("@ss.hasPermission('apihub:user-api-usage:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportUserApiUsageExcel(@Valid UserApiUsagePageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
// 导出 Excel
ExcelUtils.write(response, "用户API管理.xls", "数据", UserApiUsageRespVO.class,
userApiUsageService.getUserApiUsagePage(pageReqVO).getList());
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.userapiusage.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import com.luhu.computility.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 用户 API 使用统计分页 Request VO")
@Data
public class UserApiUsagePageReqVO extends PageParam {
@Schema(description = "用户ID", example = "26592")
private Long userId;
@Schema(description = "用户手机", example = "8522")
private String userMobile;
@Schema(description = "api名称", example = "8522")
private String apiName;
@Schema(description = "资源包名称", example = "8522")
private String packageName;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.userapiusage.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 用户 API 使用统计 Response VO")
@Data
@ExcelIgnoreUnannotated
public class UserApiUsageRespVO {
@Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2826")
@ExcelProperty("记录ID")
private Long id;
@Schema(description = "用户手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592")
@ExcelProperty("用户手机号")
private String userMobile;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("已使用次数")
private Integer usedTimes;
@Schema(description = "过期时间")
@ExcelProperty("过期时间")
private LocalDateTime expireTime;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.userapiusage.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 用户 API 使用统计新增/修改 Request VO")
@Data
public class UserApiUsageSaveReqVO {
@Schema(description = "记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2826")
private Long id;
@Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26592")
@NotNull(message = "用户ID不能为空")
private Long userId;
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8522")
@NotNull(message = "API ID不能为空")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "已使用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "已使用次数不能为空")
private Integer usedTimes;
@Schema(description = "过期时间")
private LocalDateTime expireTime;
@Schema(description = "备注", example = "随便")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.api;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.module.apihub.controller.admin.api.vo.ApiPageReqVO;
import com.luhu.computility.module.apihub.controller.admin.api.vo.ApiRespVO;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageRespVO;
import com.luhu.computility.module.apihub.controller.app.api.vo.AppApiPackageRespVO;
import com.luhu.computility.module.apihub.controller.app.api.vo.AppApiRespVO;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import com.luhu.computility.module.apihub.service.api.ApiService;
import com.luhu.computility.module.apihub.service.apicategory.ApiCategoryService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
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;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
@Tag(name = "用户 - API信息")
@RestController
@RequestMapping("/apihub/api")
@Validated
public class AppApiController {
@Resource
private ApiService apiService;
@Resource
private ApiCategoryService apiCategoryService;
@Resource
private ApiPackageService apiPackageService;
@GetMapping("/get")
@Operation(summary = "获得API信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PermitAll
public CommonResult<AppApiRespVO> getApi(@RequestParam("id") Long id) {
ApiDO api = apiService.getApi(id);
ApiCategoryDO apiCategory = apiCategoryService.getApiCategory(api.getCategoryId());
AppApiRespVO apiRespVO = BeanUtils.toBean(api, AppApiRespVO.class);
apiRespVO.setCategoryName(apiCategory.getName());
List<ApiPackageDO> apiPackageDOS = apiPackageService.selectByApiId(id);
apiRespVO.setApiPackages(BeanUtils.toBean(apiPackageDOS, AppApiPackageRespVO.class));
return success(apiRespVO);
}
@GetMapping("/page")
@Operation(summary = "获得API信息分页")
@PermitAll
public CommonResult<PageResult<AppApiRespVO>> getApiPage(@Valid ApiPageReqVO pageReqVO) {
PageResult<ApiRespVO> pageResult = apiService.getApiPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AppApiRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出API信息 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiExcel(@Valid ApiPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiRespVO> list = apiService.getApiPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "API信息.xls", "数据", AppApiRespVO.class,
BeanUtils.toBean(list, AppApiRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.api.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - API 套餐 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppApiPackageRespVO {
@Schema(description = "套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1592")
@ExcelProperty("套餐ID")
private Long id;
@Schema(description = "关联的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23999")
@ExcelProperty("关联的API ID")
private Long apiId;
@Schema(description = "套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
@ExcelProperty("套餐名称")
private String name;
@Schema(description = "可调用次数", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("可调用次数")
private Integer times;
@Schema(description = "价格(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "9887")
@ExcelProperty("价格(元)")
private BigDecimal price;
@Schema(description = "有效期(天),0表示永久有效")
@ExcelProperty("有效期(天),0表示永久有效")
private Integer validDays;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.api.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.ApiPackageRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "用户端 - API信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppApiRespVO {
@Schema(description = "API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "11243")
@ExcelProperty("API ID")
private Long id;
@Schema(description = "API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@ExcelProperty("API 名称")
private String name;
@Schema(description = "API 最低价格描述", example = "你说的对")
@ExcelProperty("API 最低价格描述")
private String priceInfo;
@Schema(description = "API coverimage", example = "https://xxx.png")
@ExcelProperty("API coverimage")
private String coverImage;
@Schema(description = "API 分类", example = "4891084201")
@ExcelProperty("API 分类")
private Long categoryId;
@Schema(description = "API 分类名称", example = "通用api")
@ExcelProperty("API 分类名称")
private String categoryName;
@Schema(description = "API 详细介绍")
@ExcelProperty("API 详细介绍")
private String detail;
@Schema(description = "接口文档内容")
@ExcelProperty("接口文档内容")
private String doc;
@Schema(description = "API 简介", example = "你说的对")
@ExcelProperty("API 简介")
private String description;
@Schema(description = "套餐包", example = "[{}]")
private List<AppApiPackageRespVO> apiPackages;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.apicategory;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.framework.excel.core.util.ExcelUtils;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.ApiCategoryPageReqVO;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.ApiCategoryRespVO;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.ApiCategorySaveReqVO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.service.apicategory.ApiCategoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static com.luhu.computility.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
@Tag(name = "用户端 - API分类")
@RestController
@RequestMapping("/apihub/api-category")
@Validated
public class AppApiCategoryController {
@Resource
private ApiCategoryService apiCategoryService;
@GetMapping("/list")
@Operation(summary = "获得API所有分类")
@PermitAll
public CommonResult<List<ApiCategoryRespVO>> getAllApiCategory() {
List<ApiCategoryDO> apiCategoryDOS = apiCategoryService.getAllApiCategory();
return success(BeanUtils.toBean(apiCategoryDOS, ApiCategoryRespVO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.apiorder;
import cn.hutool.core.collection.CollectionUtil;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.framework.security.core.util.SecurityFrameworkUtils;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderCreateReqVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderCreateRespVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderPageReqVO;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderRespVO;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import com.luhu.computility.module.apihub.enums.ApiOrderStatus;
import com.luhu.computility.module.apihub.service.api.ApiService;
import com.luhu.computility.module.apihub.service.apiorder.ApiOrderService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static com.luhu.computility.framework.common.pojo.CommonResult.success;
@Tag(name = "用户端 - api订单")
@RestController
@RequestMapping("/apihub/api-order")
@Validated
public class AppApiOrderController {
@Resource
private ApiOrderService apiOrderService;
@PostMapping("/create")
@Operation(summary = "创建api订单")
public CommonResult<AppApiOrderCreateRespVO> createApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO createReqVO) {
//创建订单
createReqVO.setUserId(SecurityFrameworkUtils.getLoginUser().getId());
ApiOrderDO order = apiOrderService.createOrder(createReqVO);
return success(new AppApiOrderCreateRespVO().setId(order.getId()).setPayOrderId(order.getPayOrderId()));
}
@GetMapping("/page")
@Operation(summary = "获得api订单分页")
public CommonResult<PageResult<AppApiOrderRespVO>> getApiOrderPage(@Valid AppApiOrderPageReqVO pageReqVO) {
PageResult<ApiOrderDO> pageResult = apiOrderService.getAppApiOrderPage(pageReqVO);
PageResult<AppApiOrderRespVO> appApiOrderRespVOPageResult
= BeanUtils.toBean(pageResult, AppApiOrderRespVO.class);
//处理状态,这里一般是交给前端处理
List<AppApiOrderRespVO> list = appApiOrderRespVOPageResult.getList();
if (!CollectionUtil.isEmpty(list)) {
for (AppApiOrderRespVO vo : list) {
vo.setStatusName(ApiOrderStatus.getRemarkByValue(vo.getStatus()));
}
}
appApiOrderRespVOPageResult.setList(list);
return success(appApiOrderRespVOPageResult);
}
/*
@PutMapping("/update")
@Operation(summary = "更新api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:update')")
public CommonResult<Boolean> updateApiOrder(@Valid @RequestBody AppApiOrderCreateReqVO updateReqVO) {
apiOrderService.updateApiOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除api订单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('apihub:api-order:delete')")
public CommonResult<Boolean> deleteApiOrder(@RequestParam("id") Long id) {
apiOrderService.deleteApiOrder(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除api订单")
@PreAuthorize("@ss.hasPermission('apihub:api-order:delete')")
public CommonResult<Boolean> deleteApiOrderList(@RequestParam("ids") List<Long> ids) {
apiOrderService.deleteApiOrderListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得api订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('apihub:api-order:query')")
public CommonResult<AppApiOrderRespVO> getApiOrder(@RequestParam("id") Long id) {
ApiOrderDO apiOrder = apiOrderService.getApiOrder(id);
return success(BeanUtils.toBean(apiOrder, AppApiOrderRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得api订单分页")
@PreAuthorize("@ss.hasPermission('apihub:api-order:query')")
public CommonResult<PageResult<AppApiOrderRespVO>> getApiOrderPage(@Valid AppApiOrderPageReqVO pageReqVO) {
PageResult<ApiOrderDO> pageResult = apiOrderService.getApiOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AppApiOrderRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出api订单 Excel")
@PreAuthorize("@ss.hasPermission('apihub:api-order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportApiOrderExcel(@Valid AppApiOrderPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ApiOrderDO> list = apiOrderService.getApiOrderPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "api订单.xls", "数据", AppApiOrderRespVO.class,
BeanUtils.toBean(list, AppApiOrderRespVO.class));
}*/
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.apiorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
@Schema(description = "用户端 - api订单新增/修改 Request VO")
@Data
public class AppApiOrderCreateReqVO {
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30231")
private Long id;
@Schema(description = "下单用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3895")
private Long userId;
@Schema(description = "购买的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@NotNull(message = "购买的API ID不能为空")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@NotNull(message = "购买的套餐ID不能为空")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "购买的套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "购买的套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "购买的套餐有效时长", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
private String orderNo;
@Schema(description = "订单实际支付金额(元)", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer costPrice;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
private Long payOrderId;
@Schema(description = "订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "订单完成时间")
private LocalDateTime finishTime;
@Schema(description = "订单取消时间")
private LocalDateTime cancelTime;
@Schema(description = "备注", example = "你说的对")
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.apiorder.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 App - api交易订单创建 Response VO")
@Data
public class AppApiOrderCreateRespVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long payOrderId;
}
package com.luhu.computility.module.apihub.controller.app.apiorder.vo;
import com.luhu.computility.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import static com.luhu.computility.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "用户端 - api订单分页 Request VO")
@Data
public class AppApiOrderPageReqVO extends PageParam {
@Schema(description = "下单用户ID", example = "3895")
private Long userId;
@Schema(description = "关键字查询", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String searchQuery;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
private Integer status;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.app.apiorder.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "用户端 - api订单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppApiOrderRespVO {
@Schema(description = "订单ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30231")
@ExcelProperty("订单ID")
private Long id;
@Schema(description = "购买的API ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
@ExcelProperty("购买的API ID")
private Long apiId;
@Schema(description = "购买的API 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "10347")
private String apiName;
@Schema(description = "购买的套餐ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
@ExcelProperty("购买的套餐ID")
private Long packageId;
@Schema(description = "购买的套餐名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private String packageName;
@Schema(description = "套餐最大可用次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageTimes;
@Schema(description = "套餐价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packagePrice;
@Schema(description = "套餐有效期", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer packageValidDays;
@Schema(description = "购买的套餐实际支出价格", requiredMode = Schema.RequiredMode.REQUIRED, example = "8957")
private Integer costPrice;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单编号")
private String orderNo;
@Schema(description = "订单状态", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("订单状态")
private String statusName;
@Schema(description = "订单状态:0=待支付,1=已支付,2=已取消", example = "2")
@ExcelProperty("订单状态:0=待支付,1=已支付,2=已取消")
private Integer status;
@Schema(description = "支付订单编号", example = "14961")
@ExcelProperty("支付订单编号")
private Long payOrderId;
@Schema(description = "订单支付时间")
@ExcelProperty("订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付成功的支付渠道")
@ExcelProperty("支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "订单完成时间")
@ExcelProperty("订单完成时间")
private LocalDateTime finishTime;
@Schema(description = "订单取消时间")
@ExcelProperty("订单取消时间")
private LocalDateTime cancelTime;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.api;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API信息 DO
*
* @author ljq
*/
@TableName("apihub_api")
@KeySequence("apihub_api_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiDO extends BaseDO {
/**
* API ID
*/
@TableId
private Long id;
/**
* API 名称
*/
private String name;
/**
* API 最低价格描述
*/
private String priceInfo;
/**
* API coverimage
*/
private String coverImage;
/**
* API 分类
*/
private Long categoryId;
/**
* API 简介
*/
private String description;
/**
* API 详细介绍
*/
private String detail;
/**
* 接口文档内容
*/
private String doc;
/**
* 状态:1=上架,0=下架
*/
private Integer status;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apicalllog;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API 调用日志 DO
*
* @author ljq
*/
@TableName("apihub_api_call_log")
@KeySequence("apihub_api_call_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiCallLogDO extends BaseDO {
/**
* 调用日志ID
*/
@TableId
private Long id;
/**
* 调用用户ID
*/
private Long userId;
/**
* 调用的API ID
*/
private Long apiId;
/**
* 请求参数
*/
private String requestParams;
/**
* 响应状态(如200, 500等)
*/
private String responseStatus;
/**
* 调用时间
*/
private LocalDateTime callTime;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apicategory;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API分类 DO
*
* @author ljq
*/
@TableName("apihub_api_category")
@KeySequence("apihub_api_category_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiCategoryDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
* 分类名称
*/
private String name;
/**
* 分类简介
*/
private String description;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apiendpoint;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API 接口 DO
*
* @author ljq
*/
@TableName("apihub_api_endpoint")
@KeySequence("apihub_api_endpoint_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiEndpointDO extends BaseDO {
/**
* 接口ID
*/
@TableId
private Long id;
/**
* 接口名称
*/
private String name;
/**
* 接口路径,全路径例如 https://phsl.lijinqi.com/openn_ip/xxx
*/
private String path;
/**
* 请求方式: GET/POST/PUT/DELETE
*/
private String method;
/**
* 参数定义(JSON)
*/
private String params;
/**
* 返回结果示例
*/
private String response;
/**
* 鉴权方式,例如 API_KEY/OAUTH
*/
private String authType;
/**
* 接口级限流规则,例如 100 QPS
*/
private String rateLimit;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API 应用与接口关系 DO
*
* @author ljq
*/
@TableName("apihub_api_endpoint_rel")
@KeySequence("apihub_api_endpoint_rel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiEndpointRelDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* API 应用ID,关联 apihub_api.id
*/
private Long apiId;
/**
* 接口ID,关联 apihub_api_endpoint.id
*/
private Long apiEndpointId;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apiorder;
import com.alipay.api.domain.AlipayOpenStsTokenGetModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* api订单 DO
*
* @author ljq
*/
@TableName("apihub_api_order")
@KeySequence("apihub_api_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiOrderDO extends BaseDO {
/**
* 订单ID
*/
@TableId
private Long id;
/**
* 下单用户ID
*/
private Long userId;
/**
* 购买的API ID
*/
private Long apiId;
/**
* 购买的套餐名称
*/
private String apiName;
/**
* 购买的套餐ID
*/
private Long packageId;
/**
* 购买的套餐名
*/
private String packageName;
/**
* 购买的套餐最大可用次数
*/
private Integer packageTimes;
/**
* 购买的套餐有效期
*/
private Integer packageValidDays;
/**
* 购买的套餐实际费用
*/private Integer costPrice;
/**
* 购买的套餐单价
*/
private Integer packagePrice;
/**
* 订单编号
*/
private String orderNo;
/**
* 订单状态:0=待支付,1=已支付,2=已取消
*/
private Integer status;
/**
* 支付状态:1=已支付,2=未支付
*/
private Integer payStatus;
/**
* 支付订单编号
*/
private Long payOrderId;
/**
* 订单支付时间
*/
private LocalDateTime payTime;
/**
* 支付成功的支付渠道
*/
private String payChannelCode;
/**
* 订单完成时间
*/
private LocalDateTime finishTime;
/**
* 订单取消时间
*/
private LocalDateTime cancelTime;
/**
* 备注
*/
private String remark;
/**
* ip
*/
private String userIp;
/**
* 退款状态
*/
private Integer refundStatus;
/**
* 退款金额,单位:分
*/
private Integer refundPrice;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.apipackage;
import lombok.*;
import java.util.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* API 套餐 DO
*
* @author ljq
*/
@TableName("apihub_api_package")
@KeySequence("apihub_api_package_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ApiPackageDO extends BaseDO {
/**
* 套餐ID
*/
@TableId
private Long id;
/**
* 关联的API ID
*/
private Long apiId;
/**
* 套餐名称
*/
private String name;
/**
* 可调用次数
*/
private Integer times;
/**
* 价格(元)
*/
private Integer price;
/**
* 有效期(天),0表示永久有效
*/
private Integer validDays;
/**
* 上架状态
*/
private Boolean status;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.appcredential;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* 用户密钥信息 DO
*
* @author ljq
*/
@TableName("apihub_app_credential")
@KeySequence("apihub_app_credential_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AppCredentialDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 应用ID,唯一
*/
private String appId;
/**
* AES加密后的应用密钥
*/
private String appSecret;
/**
* 所属用户ID
*/
private Long userId;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.dataobject.userapiusage;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
/**
* 用户 API 使用统计 DO
*
* @author ljq
*/
@TableName("apihub_user_api_usage")
@KeySequence("apihub_user_api_usage_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserApiUsageDO extends BaseDO {
/**
* 记录ID
*/
@TableId
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 购买的API ID
*/
private Long apiId;
/**
* 购买的套餐名称
*/
private String apiName;
/**
* 购买的套餐ID
*/
private Long packageId;
/**
* 购买的套餐名
*/
private String packageName;
/**
* 购买的套餐最大可用次数
*/
private Long packageTimes;
/**
* 购买的套餐有效期
*/
private Integer packageValidDays;
/**
* 已使用次数
*/
private Integer usedTimes;
/**
* 过期时间
*/
private LocalDateTime expireTime;
/**
* 备注
*/
private String remark;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.api;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.api.vo.*;
/**
* API信息 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiMapper extends BaseMapperX<ApiDO> {
default PageResult<ApiDO> selectPage(ApiPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiDO>()
.likeIfPresent(ApiDO::getName, reqVO.getName())
.eqIfPresent(ApiDO::getStatus, reqVO.getStatus())
.eqIfPresent(ApiDO::getCategoryId, reqVO.getCategoryId())
.betweenIfPresent(ApiDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiDO::getId));
}
default PageResult<ApiRespVO> selectJoinPage(ApiPageReqVO reqVO) {
return selectJoinPage(reqVO, ApiRespVO.class , new MPJLambdaWrapperX<ApiDO>()
.selectAll(ApiDO.class)
.selectAs(ApiCategoryDO :: getName, ApiRespVO :: getCategoryName)
.leftJoin(ApiCategoryDO.class, ApiCategoryDO::getId, ApiDO::getCategoryId)
.eq(!ObjectUtil.isEmpty(reqVO.getCategoryId()), ApiCategoryDO::getId, reqVO.getCategoryId() )
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiCategoryDO::getName, reqVO.getSearchQuery())
.or(!StringUtils.isEmpty(reqVO.getSearchQuery()))
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiDO::getName, reqVO.getSearchQuery())
.orderByDesc(ApiDO::getId));
}
/*selectJoinPage(queryVO, ProductSkuRespVO.class, new MPJLambdaWrapperX<ProductSkuDO>()
.selectAll(ProductSkuDO.class)
.select(ProductSpuDO::getName)
.leftJoin(ProductSpuDO.class, ProductSpuDO::getId, ProductSkuDO::getSpuId)
.eq(!ObjectUtil.isEmpty(queryVO.getCategoryId()), ProductSpuDO::getCategoryId, queryVO.getCategoryId() )
.orderByDesc(ProductSkuDO::getCreator));*/
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apicalllog;
import java.util.*;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.apihub.dal.dataobject.apicalllog.ApiCallLogDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apicalllog.vo.*;
/**
* API 调用日志 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiCallLogMapper extends BaseMapperX<ApiCallLogDO> {
default PageResult<ApiCallLogDO> selectPage(ApiCallLogPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiCallLogDO>()
.eqIfPresent(ApiCallLogDO::getUserId, reqVO.getUserId())
.eqIfPresent(ApiCallLogDO::getApiId, reqVO.getApiId())
.eqIfPresent(ApiCallLogDO::getResponseStatus, reqVO.getResponseStatus())
.betweenIfPresent(ApiCallLogDO::getCallTime, reqVO.getCallTime())
.betweenIfPresent(ApiCallLogDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiCallLogDO::getId));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apicategory;
import java.util.*;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.*;
/**
* API分类 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiCategoryMapper extends BaseMapperX<ApiCategoryDO> {
default PageResult<ApiCategoryDO> selectPage(ApiCategoryPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiCategoryDO>()
.likeIfPresent(ApiCategoryDO::getName, reqVO.getName())
.betweenIfPresent(ApiCategoryDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiCategoryDO::getId));
}
default List<ApiCategoryDO> selectAll() {
return selectList();
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apiendpoint;
import java.util.*;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpoint.ApiEndpointDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel.ApiEndpointRelDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.*;
/**
* API 接口 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiEndpointMapper extends BaseMapperX<ApiEndpointDO> {
default PageResult<ApiEndpointDO> selectPage(ApiEndpointPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiEndpointDO>()
.likeIfPresent(ApiEndpointDO::getName, reqVO.getName())
.eqIfPresent(ApiEndpointDO::getPath, reqVO.getPath())
.eqIfPresent(ApiEndpointDO::getMethod, reqVO.getMethod())
.eqIfPresent(ApiEndpointDO::getParams, reqVO.getParams())
.eqIfPresent(ApiEndpointDO::getResponse, reqVO.getResponse())
.eqIfPresent(ApiEndpointDO::getAuthType, reqVO.getAuthType())
.eqIfPresent(ApiEndpointDO::getRateLimit, reqVO.getRateLimit())
.eqIfPresent(ApiEndpointDO::getRemark, reqVO.getRemark())
.betweenIfPresent(ApiEndpointDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiEndpointDO::getId));
}
default List<ApiEndpointDO> selectAll() {
return selectList();
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apiendpointrel;
import java.util.*;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo.ApiEndpointRespVO;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpoint.ApiEndpointDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel.ApiEndpointRelDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiendpointrel.vo.*;
/**
* API 应用与接口关系 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiEndpointRelMapper extends BaseMapperX<ApiEndpointRelDO> {
default PageResult<ApiEndpointRelDO> selectPage(ApiEndpointRelPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiEndpointRelDO>()
.eqIfPresent(ApiEndpointRelDO::getApiId, reqVO.getApiId())
.eqIfPresent(ApiEndpointRelDO::getApiEndpointId, reqVO.getApiEndpointId())
.betweenIfPresent(ApiEndpointRelDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiEndpointRelDO::getId));
}
default int deleteByApiId(Long apiId) {
return delete(new LambdaQueryWrapperX<ApiEndpointRelDO>()
.eqIfPresent(ApiEndpointRelDO::getApiId, apiId));
}
default List<ApiEndpointRespVO> getApiEndpointByApiId(Long apiId) {
return selectJoinList(ApiEndpointRespVO.class, new MPJLambdaWrapperX<ApiEndpointRelDO>()
.selectAs(ApiEndpointDO::getName, ApiEndpointRespVO::getName)
.selectAs(ApiEndpointDO::getMethod, ApiEndpointRespVO::getMethod)
.selectAs(ApiEndpointDO::getPath, ApiEndpointRespVO::getPath)
.selectAs(ApiEndpointRelDO::getApiEndpointId, ApiEndpointRespVO::getId)
.leftJoin(ApiEndpointDO.class, ApiEndpointDO::getId, ApiEndpointRelDO::getApiEndpointId)
.eqIfPresent(ApiEndpointRelDO::getApiId, apiId)
);
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apiorder;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.apihub.controller.app.apiorder.vo.AppApiOrderPageReqVO;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiorder.ApiOrderDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiorder.vo.*;
/**
* api订单 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiOrderMapper extends BaseMapperX<ApiOrderDO> {
default PageResult<ApiOrderDO> selectPage(ApiOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiOrderDO>()
.eqIfPresent(ApiOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(ApiOrderDO::getApiId, reqVO.getApiId())
.eqIfPresent(ApiOrderDO::getPackageId, reqVO.getPackageId())
.eqIfPresent(ApiOrderDO::getOrderNo, reqVO.getOrderNo())
.eqIfPresent(ApiOrderDO::getStatus, reqVO.getStatus())
.eqIfPresent(ApiOrderDO::getPayOrderId, reqVO.getPayOrderId())
.betweenIfPresent(ApiOrderDO::getPayTime, reqVO.getPayTime())
.eqIfPresent(ApiOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
.betweenIfPresent(ApiOrderDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiOrderDO::getId));
}
default PageResult<ApiOrderDO> selectAppPage(AppApiOrderPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiOrderDO>()
.eqIfPresent(ApiOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(ApiOrderDO::getStatus, reqVO.getStatus())
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiOrderDO::getOrderNo, reqVO.getSearchQuery())
.or(!StringUtils.isEmpty(reqVO.getSearchQuery()))
.like(!StringUtils.isEmpty(reqVO.getSearchQuery()), ApiOrderDO::getApiName, reqVO.getSearchQuery())
.orderByDesc(ApiOrderDO::getId));
}
default int updateByIdAndStatus(Long id, Integer status, ApiOrderDO update) {
return update(update, new LambdaUpdateWrapper<ApiOrderDO>()
.eq(ApiOrderDO::getId, id).eq(ApiOrderDO::getStatus, status));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.apipackage;
import java.util.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.QueryWrapperX;
import com.luhu.computility.module.apihub.dal.dataobject.apipackage.ApiPackageDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apipackage.vo.*;
/**
* API 套餐 Mapper
*
* @author ljq
*/
@Mapper
public interface ApiPackageMapper extends BaseMapperX<ApiPackageDO> {
default PageResult<ApiPackageDO> selectPage(ApiPackagePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ApiPackageDO>()
.eqIfPresent(ApiPackageDO::getApiId, reqVO.getApiId())
.likeIfPresent(ApiPackageDO::getName, reqVO.getName())
.betweenIfPresent(ApiPackageDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ApiPackageDO::getId));
}
default List<ApiPackageDO> selectByApiId(Long id) {
return selectList(new LambdaQueryWrapperX<ApiPackageDO>()
.eqIfPresent(ApiPackageDO::getApiId, id)
.orderByDesc(ApiPackageDO::getId));
}
default boolean deleteApiPackageByApiId(Long id ) {
return this.delete(new LambdaQueryWrapper<ApiPackageDO>()
.eq(ApiPackageDO::getApiId, id)) > 0;
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.appcredential;
import java.util.*;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.module.apihub.dal.dataobject.appcredential.AppCredentialDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.appcredential.vo.*;
/**
* 用户密钥信息 Mapper
*
* @author ljq
*/
@Mapper
public interface AppCredentialMapper extends BaseMapperX<AppCredentialDO> {
default PageResult<AppCredentialDO> selectPage(AppCredentialPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AppCredentialDO>()
.eqIfPresent(AppCredentialDO::getAppId, reqVO.getAppId())
.eqIfPresent(AppCredentialDO::getAppSecret, reqVO.getAppSecret())
.eqIfPresent(AppCredentialDO::getUserId, reqVO.getUserId())
.betweenIfPresent(AppCredentialDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AppCredentialDO::getId));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.mysql.userapiusage;
import java.util.*;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.MPJLambdaWrapperX;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.module.apihub.dal.dataobject.userapiusage.UserApiUsageDO;
import com.luhu.computility.module.member.dal.dataobject.user.MemberUserDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.userapiusage.vo.*;
/**
* 用户 API 使用统计 Mapper
*
* @author ljq
*/
@Mapper
public interface UserApiUsageMapper extends BaseMapperX<UserApiUsageDO> {
default PageResult<UserApiUsageRespVO> selectPage(UserApiUsagePageReqVO reqVO) {
return selectJoinPage(reqVO, UserApiUsageRespVO.class, new MPJLambdaWrapperX<UserApiUsageDO>()
.selectAll(UserApiUsageDO.class)
.selectAs(MemberUserDO :: getMobile, UserApiUsageRespVO :: getUserMobile)
.leftJoin(MemberUserDO.class, MemberUserDO::getId,UserApiUsageDO::getUserId)
.like(!StringUtils.isEmpty(reqVO.getPackageName()), UserApiUsageDO::getPackageName, reqVO.getPackageName())
.like(!StringUtils.isEmpty(reqVO.getApiName()), UserApiUsageDO::getApiName, reqVO.getApiName())
.orderByDesc(UserApiUsageDO::getCreateTime));
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.dal.redis;
/**
* 交易 Redis Key 枚举类
*
* @author 芋道源码
*/
public interface RedisKeyConstants {
/**
* api交易序号的缓存
*
* KEY 格式:trade_no:{prefix}
* VALUE 数据格式:编号自增
*/
String API_TRADE_NO = "api_trade_no:";
/**
* api交易序号的缓存
*
* KEY 格式:express_track:{code-logisticsNo-receiverMobile}
* VALUE 数据格式 String, 物流信息集合
*/
String EXPRESS_TRACK = "express_track";
}
package com.luhu.computility.module.apihub.dal.redis.no;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.luhu.computility.module.apihub.dal.redis.RedisKeyConstants;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
import java.time.Duration;
import java.time.LocalDateTime;
/**
* 订单序号的 Redis DAO
*
* @author HUIHUI
*/
@Repository
public class ApiOrderNoRedisDAO {
public static final String API_ORDER_NO_PREFIX = "a";
public static final String AFTER_SALE_NO_PREFIX = "p";
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 生成序号
*
* @param prefix 前缀
* @return 序号
*/
public String generate(String prefix) {
// 递增序号
String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
String key = RedisKeyConstants.API_TRADE_NO + noPrefix;
Long no = stringRedisTemplate.opsForValue().increment(key);
// 设置过期时间
stringRedisTemplate.expire(key, Duration.ofMinutes(1L));
return noPrefix + no;
}
}
package com.luhu.computility.module.apihub.enums;
/**
* 订单支付状态
*/
public enum ApiOrderPayStatus {
// 请根据实际情况改成对应的值和备注
WAITING(0, "未支付"),
SUCCESS(10, "支付成功"),
REFUND(20, "已退款"),
CLOSED(30, "支付关闭"), // 注意:全部退款后,还是 REFUND 状态
;
private int value;
private String remark;
private ApiOrderPayStatus(int value, String remark) {
this.value = value;
this.remark = remark;
}
public int getValue() {
return value;
}
public String getRemark() {
return remark;
}
public static ApiOrderPayStatus getByValue(int value) {
for (ApiOrderPayStatus o : ApiOrderPayStatus.values()) {
if (o.getValue() == value) {
return o;
}
}
return null;
}
public static String getRemarkByValue(Integer value) {
for (ApiOrderPayStatus status : values()) {
if (status.getValue() == value) {
return status.getRemark();
}
}
return null;
}
}
package com.luhu.computility.module.apihub.enums;
/**
* 订单退款状态
*/
public enum ApiOrderRefundStatus {
// 请根据实际情况改成对应的值和备注
NONE(0, "未退款"),
ALL(20, "全部退款");
private int value;
private String remark;
private ApiOrderRefundStatus(int value, String remark) {
this.value = value;
this.remark = remark;
}
public int getValue() {
return value;
}
public String getRemark() {
return remark;
}
public static ApiOrderRefundStatus getByValue(int value) {
for (ApiOrderRefundStatus o : ApiOrderRefundStatus.values()) {
if (o.getValue() == value) {
return o;
}
}
return null;
}
}
package com.luhu.computility.module.apihub.enums;
/**
* 订单状态
*/
public enum ApiOrderStatus {
// 请根据实际情况改成对应的值和备注
UNPAID(0, "待支付"),
PAID(10, "已支付"),
CANCELED(40, "已取消");
private int value;
private String remark;
private ApiOrderStatus(int value, String remark) {
this.value = value;
this.remark = remark;
}
public int getValue() {
return value;
}
public String getRemark() {
return remark;
}
public static ApiOrderStatus getByValue(int value) {
for (ApiOrderStatus o : ApiOrderStatus.values()) {
if (o.getValue() == value) {
return o;
}
}
return null;
}
public static String getRemarkByValue(Integer value) {
for (ApiOrderStatus status : values()) {
if (status.getValue() == value) {
return status.getRemark();
}
}
return null;
}
}
package com.luhu.computility.module.apihub.enums;
import com.luhu.computility.framework.common.exception.ErrorCode;
/**
* ApiHub 错误码枚举类
* <p>
* ApiHub 系统,使用 1-010-000-000 段
*/
public interface ErrorCodeConstants {
ErrorCode USER_API_USAGE_NOT_EXISTS = new ErrorCode(1_010_001_000, "用户 API 使用统计不存在");
ErrorCode API_CALL_LOG_NOT_EXISTS = new ErrorCode(1_010_001_001, " API 日志不存在");
ErrorCode API_NOT_EXISTS = new ErrorCode(1_010_001_002, " API 模块不存在");
ErrorCode API_ORDER_NOT_EXISTS = new ErrorCode(1_010_001_003, " API 订单不存在");
ErrorCode API_PACKAGE_NOT_EXISTS = new ErrorCode(1_010_001_004, " API 套餐不存在");
ErrorCode API_CATEGORY_NOT_EXISTS = new ErrorCode(1_010_001_005, "API分类不存在");
ErrorCode API_ORDER_NOT_FOUND = new ErrorCode(1_010_001_011, "API订单不存在");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_ID_ERROR = new ErrorCode(1_010_001_014, "API订单更新支付状态失败,支付单编号不匹配");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_ORDER_STATUS_NOT_SUCCESS = new ErrorCode(1_010_001_015, "API订单更新支付状态失败,支付单状态不是【支付成功】状态");
ErrorCode API_ORDER_UPDATE_PAID_FAIL_PAY_PRICE_NOT_MATCH = new ErrorCode(1_010_001_016, "API订单更新支付状态失败,支付单金额不匹配");
ErrorCode API_ENDPOINT_NOT_EXISTS = new ErrorCode(1_010_001_017, "API 接口不存在");
ErrorCode API_ENDPOINT_REL_NOT_EXISTS = new ErrorCode(1_010_001_018, "API 应用与接口关系不存在");
ErrorCode APP_CREDENTIAL_NOT_EXISTS = new ErrorCode(1_010_001_019, "用户密钥信息不存在");
}
package com.luhu.computility.module.apihub.service.api;
import java.util.*;
import javax.validation.*;
import com.luhu.computility.module.apihub.controller.admin.api.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
/**
* API信息 Service 接口
*
* @author ljq
*/
public interface ApiService {
/**
* 创建API信息
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createApi(@Valid ApiSaveReqVO createReqVO);
/**
* 更新API信息
*
* @param updateReqVO 更新信息
*/
void updateApi(@Valid ApiSaveReqVO updateReqVO);
/**
* 删除API信息
*
* @param id 编号
*/
void deleteApi(Long id);
/**
* 批量删除API信息
*
* @param ids 编号
*/
void deleteApiListByIds(List<Long> ids);
/**
* 获得API信息
*
* @param id 编号
* @return API信息
*/
ApiDO getApi(Long id);
/**
* 获得API信息分页
*
* @param pageReqVO 分页查询
* @return API信息分页
*/
PageResult<ApiRespVO> getApiPage(ApiPageReqVO pageReqVO);
}
\ No newline at end of file
package com.luhu.computility.module.apihub.service.api;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.luhu.computility.module.apihub.controller.admin.api.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.api.ApiDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.module.apihub.dal.mysql.api.ApiMapper;
import static com.luhu.computility.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.convertList;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.diffList;
import static com.luhu.computility.module.apihub.enums.ErrorCodeConstants.*;
/**
* API信息 Service 实现类
*
* @author ljq
*/
@Service
@Validated
public class ApiServiceImpl implements ApiService {
@Resource
private ApiMapper apiMapper;
@Override
public Long createApi(ApiSaveReqVO createReqVO) {
// 插入
ApiDO api = BeanUtils.toBean(createReqVO, ApiDO.class);
apiMapper.insert(api);
// 返回
return api.getId();
}
@Override
public void updateApi(ApiSaveReqVO updateReqVO) {
// 校验存在
validateApiExists(updateReqVO.getId());
// 更新
ApiDO updateObj = BeanUtils.toBean(updateReqVO, ApiDO.class);
apiMapper.updateById(updateObj);
}
@Override
public void deleteApi(Long id) {
// 校验存在
validateApiExists(id);
// 删除
apiMapper.deleteById(id);
}
@Override
public void deleteApiListByIds(List<Long> ids) {
// 删除
apiMapper.deleteByIds(ids);
}
private void validateApiExists(Long id) {
if (apiMapper.selectById(id) == null) {
throw exception(API_NOT_EXISTS);
}
}
@Override
public ApiDO getApi(Long id) {
return apiMapper.selectById(id);
}
@Override
public PageResult<ApiRespVO> getApiPage(ApiPageReqVO pageReqVO) {
return apiMapper.selectJoinPage(pageReqVO);
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.service.apicalllog;
import java.util.*;
import javax.validation.*;
import com.luhu.computility.module.apihub.controller.admin.apicalllog.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicalllog.ApiCallLogDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
/**
* API 调用日志 Service 接口
*
* @author ljq
*/
public interface ApiCallLogService {
/**
* 创建API 调用日志
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createApiCallLog(@Valid ApiCallLogSaveReqVO createReqVO);
/**
* 更新API 调用日志
*
* @param updateReqVO 更新信息
*/
void updateApiCallLog(@Valid ApiCallLogSaveReqVO updateReqVO);
/**
* 删除API 调用日志
*
* @param id 编号
*/
void deleteApiCallLog(Long id);
/**
* 批量删除API 调用日志
*
* @param ids 编号
*/
void deleteApiCallLogListByIds(List<Long> ids);
/**
* 获得API 调用日志
*
* @param id 编号
* @return API 调用日志
*/
ApiCallLogDO getApiCallLog(Long id);
/**
* 获得API 调用日志分页
*
* @param pageReqVO 分页查询
* @return API 调用日志分页
*/
PageResult<ApiCallLogDO> getApiCallLogPage(ApiCallLogPageReqVO pageReqVO);
}
\ No newline at end of file
package com.luhu.computility.module.apihub.service.apicalllog;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.luhu.computility.module.apihub.controller.admin.apicalllog.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicalllog.ApiCallLogDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.module.apihub.dal.mysql.apicalllog.ApiCallLogMapper;
import static com.luhu.computility.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.convertList;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.diffList;
import static com.luhu.computility.module.apihub.enums.ErrorCodeConstants.*;
/**
* API 调用日志 Service 实现类
*
* @author ljq
*/
@Service
@Validated
public class ApiCallLogServiceImpl implements ApiCallLogService {
@Resource
private ApiCallLogMapper apiCallLogMapper;
@Override
public Long createApiCallLog(ApiCallLogSaveReqVO createReqVO) {
// 插入
ApiCallLogDO apiCallLog = BeanUtils.toBean(createReqVO, ApiCallLogDO.class);
apiCallLogMapper.insert(apiCallLog);
// 返回
return apiCallLog.getId();
}
@Override
public void updateApiCallLog(ApiCallLogSaveReqVO updateReqVO) {
// 校验存在
validateApiCallLogExists(updateReqVO.getId());
// 更新
ApiCallLogDO updateObj = BeanUtils.toBean(updateReqVO, ApiCallLogDO.class);
apiCallLogMapper.updateById(updateObj);
}
@Override
public void deleteApiCallLog(Long id) {
// 校验存在
validateApiCallLogExists(id);
// 删除
apiCallLogMapper.deleteById(id);
}
@Override
public void deleteApiCallLogListByIds(List<Long> ids) {
// 删除
apiCallLogMapper.deleteByIds(ids);
}
private void validateApiCallLogExists(Long id) {
if (apiCallLogMapper.selectById(id) == null) {
throw exception(API_CALL_LOG_NOT_EXISTS);
}
}
@Override
public ApiCallLogDO getApiCallLog(Long id) {
return apiCallLogMapper.selectById(id);
}
@Override
public PageResult<ApiCallLogDO> getApiCallLogPage(ApiCallLogPageReqVO pageReqVO) {
return apiCallLogMapper.selectPage(pageReqVO);
}
}
\ No newline at end of file
package com.luhu.computility.module.apihub.service.apicategory;
import java.util.*;
import javax.validation.*;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
/**
* API分类 Service 接口
*
* @author ljq
*/
public interface ApiCategoryService {
/**
* 创建API分类
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createApiCategory(@Valid ApiCategorySaveReqVO createReqVO);
/**
* 更新API分类
*
* @param updateReqVO 更新信息
*/
void updateApiCategory(@Valid ApiCategorySaveReqVO updateReqVO);
/**
* 删除API分类
*
* @param id 编号
*/
void deleteApiCategory(Long id);
/**
* 批量删除API分类
*
* @param ids 编号
*/
void deleteApiCategoryListByIds(List<Long> ids);
/**
* 获得API分类
*
* @param id 编号
* @return API分类
*/
ApiCategoryDO getApiCategory(Long id);
/**
* 获得API分类分页
*
* @param pageReqVO 分页查询
* @return API分类分页
*/
PageResult<ApiCategoryDO> getApiCategoryPage(ApiCategoryPageReqVO pageReqVO);
/**
* 获得API分类分页
*
* @return API分类分页
*/
List<ApiCategoryDO> getAllApiCategory();
}
\ No newline at end of file
package com.luhu.computility.module.apihub.service.apicategory;
import cn.hutool.core.collection.CollUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import com.luhu.computility.module.apihub.controller.admin.apicategory.vo.*;
import com.luhu.computility.module.apihub.dal.dataobject.apicategory.ApiCategoryDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.util.object.BeanUtils;
import com.luhu.computility.module.apihub.dal.mysql.apicategory.ApiCategoryMapper;
import static com.luhu.computility.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.convertList;
import static com.luhu.computility.framework.common.util.collection.CollectionUtils.diffList;
import static com.luhu.computility.module.apihub.enums.ErrorCodeConstants.*;
/**
* API分类 Service 实现类
*
* @author ljq
*/
@Service
@Validated
public class ApiCategoryServiceImpl implements ApiCategoryService {
@Resource
private ApiCategoryMapper apiCategoryMapper;
@Override
public Long createApiCategory(ApiCategorySaveReqVO createReqVO) {
// 插入
ApiCategoryDO apiCategory = BeanUtils.toBean(createReqVO, ApiCategoryDO.class);
apiCategoryMapper.insert(apiCategory);
// 返回
return apiCategory.getId();
}
@Override
public void updateApiCategory(ApiCategorySaveReqVO updateReqVO) {
// 校验存在
validateApiCategoryExists(updateReqVO.getId());
// 更新
ApiCategoryDO updateObj = BeanUtils.toBean(updateReqVO, ApiCategoryDO.class);
apiCategoryMapper.updateById(updateObj);
}
@Override
public void deleteApiCategory(Long id) {
// 校验存在
validateApiCategoryExists(id);
// 删除
apiCategoryMapper.deleteById(id);
}
@Override
public void deleteApiCategoryListByIds(List<Long> ids) {
// 删除
apiCategoryMapper.deleteByIds(ids);
}
private void validateApiCategoryExists(Long id) {
if (apiCategoryMapper.selectById(id) == null) {
throw exception(API_CATEGORY_NOT_EXISTS);
}
}
@Override
public ApiCategoryDO getApiCategory(Long id) {
return apiCategoryMapper.selectById(id);
}
@Override
public PageResult<ApiCategoryDO> getApiCategoryPage(ApiCategoryPageReqVO pageReqVO) {
return apiCategoryMapper.selectPage(pageReqVO);
}
@Override
public List<ApiCategoryDO> getAllApiCategory() {
return apiCategoryMapper.selectAll();
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment