Commit 5c84d461 by lijinqi

Merge branch 'api' into develop

# Conflicts:
#	computility-module-apihub/src/main/java/com/luhu/computility/module/apihub/dal/mysql/apicalllog/ApiCallLogMapper.java
#	computility-module-apihub/src/main/java/com/luhu/computility/module/apihub/dal/mysql/apiorder/ApiOrderMapper.java
#	computility-module-apihub/src/main/java/com/luhu/computility/module/apihub/service/apicalllog/ApiCallLogServiceImpl.java
#	computility-module-apihub/src/main/java/com/luhu/computility/module/apihub/service/apiorder/ApiOrderServiceImpl.java
parent 768875ff
......@@ -43,18 +43,6 @@
<scope>test</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.luhu</groupId>-->
<!-- <artifactId>computility-module-external</artifactId>-->
<!-- <version>${revision}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-apihub-api</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>
package com.luhu.computility.framework.signature.core.redis;
import cn.hutool.core.util.BooleanUtil;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
......@@ -26,11 +25,6 @@ public class ApiSignatureRedisDAO {
private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s";
/**
* 用户套餐使用次数 Key 前缀
*/
public static final String USAGE_KEY = "api_usage:";
/**
* 签名密钥
* <p>
* HASH 结构
......@@ -60,54 +54,4 @@ public class ApiSignatureRedisDAO {
return (String) stringRedisTemplate.opsForHash().get(SIGNATURE_APPID, appId);
}
// ========== 用户套餐使用次数 ==========
/**
* 原子自增用户套餐使用次数
*
* @param key Redis key(USAGE_KEY + apiEndpointId + userId)
* @return 当前使用次数
*/
public Long incrementUsage(String key) {
return stringRedisTemplate.opsForValue().increment(key, 1);
}
/**
* 获取用户套餐已使用次数
*
* @param key Redis key
* @return 使用次数
*/
public Long getUsage(String key) {
String value = stringRedisTemplate.opsForValue().get(key);
if (value == null) {
return 0L;
}
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
return 0L;
}
}
/**
* 重置用户套餐使用次数(可选,用于测试或套餐刷新)
*/
public void resetUsage(String key) {
stringRedisTemplate.opsForValue().set(key, "0");
}
/**
* 增加用户套餐使用次数,并设置过期时间
*
* @param key Redis key
* @return 当前使用次数
*/
public Integer incrementUsageWithExpire(String key, Long consumptionPoints) {
Integer used = stringRedisTemplate.opsForValue().increment(key, consumptionPoints).intValue();
return used;
}
}
......@@ -10,7 +10,6 @@
<artifactId>computility-module-apihub-api</artifactId>
<packaging>jar</packaging>
<name>computility-module-apihub-api</name>
<url>http://maven.apache.org</url>
<properties>
......@@ -23,11 +22,36 @@
<artifactId>computility-common</artifactId>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-web</artifactId>
<scope>provided</scope> <!-- 设置为 provided,只有限流、幂等使用到 -->
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>provided</scope> <!-- 设置为 provided,只有工具类需要使用到 -->
</dependency>
<!-- DB 相关 -->
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-spring-boot-starter-redis</artifactId>
</dependency>
<!-- 服务保障相关 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>lock4j-redisson-spring-boot-starter</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
package com.luhu.computility.module.apihub.signature.config;
import com.luhu.computility.framework.redis.config.ComputilityRedisAutoConfiguration;
import com.luhu.computility.module.apihub.signature.core.aop.ApiHubApiSignatureAspect;
import com.luhu.computility.module.apihub.signature.core.redis.ApiHubApiSignatureRedisDAO;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
* HTTP API 签名的自动配置类
*
* @author Zhougang
*/
@AutoConfiguration(after = ComputilityRedisAutoConfiguration.class)
public class ComputilityApiHubApiSignatureAutoConfiguration {
@Bean
public ApiHubApiSignatureAspect signatureAspect(ApiHubApiSignatureRedisDAO signatureRedisDAO) {
return new ApiHubApiSignatureAspect(signatureRedisDAO);
}
@Bean
public ApiHubApiSignatureRedisDAO signatureRedisDAO(StringRedisTemplate stringRedisTemplate) {
return new ApiHubApiSignatureRedisDAO(stringRedisTemplate);
}
}
package com.luhu.computility.module.apihub.signature.core.annotation;
import com.luhu.computility.framework.common.exception.enums.GlobalErrorCodeConstants;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;
/**
* HTTP API 签名注解
*
* @author Zhougang
*/
@Inherited
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiHubApiSignature {
/**
* 同一个请求多长时间内有效 默认 60 秒
*/
int timeout() default 60;
/**
* 时间单位,默认为 SECONDS 秒
*/
TimeUnit timeUnit() default TimeUnit.SECONDS;
// ========================== 签名参数 ==========================
/**
* 提示信息,签名失败的提示
*
* @see GlobalErrorCodeConstants#BAD_REQUEST
*/
String message() default "签名不正确"; // 为空时,使用 BAD_REQUEST 错误提示
/**
* 签名字段:appId 应用ID
*/
String appId() default "appId";
/**
* 签名字段:timestamp 时间戳
*/
String timestamp() default "timestamp";
/**
* 签名字段:nonce 随机数,10 位以上
*/
String nonce() default "nonce";
/**
* sign 客户端签名
*/
String sign() default "sign";
}
package com.luhu.computility.module.apihub.signature.core.redis;
import lombok.AllArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;
/**
* HTTP API 签名 Redis DAO
*
* @author Zhougang
*/
@AllArgsConstructor
public class ApiHubApiSignatureRedisDAO {
private final StringRedisTemplate stringRedisTemplate;
/**
* 验签随机数
* <p>
* KEY 格式:signature_nonce:%s // 参数为 随机数
* VALUE 格式:String
* 过期时间:不固定
*/
private static final String SIGNATURE_NONCE = "api_signature_nonce:%s:%s";
/**
* 用户套餐使用次数 Key 前缀
*/
public static final String USAGE_KEY = "api_usage:";
/**
* 签名密钥
* <p>
* HASH 结构
* KEY 格式:%s // 参数为 appid
* VALUE 格式:String
* 过期时间:永不过期(预加载到 Redis)
*/
private static final String SIGNATURE_APPID = "api_signature_app";
// ========== 验签随机数 ==========
public String getNonce(String appId, String nonce) {
return stringRedisTemplate.opsForValue().get(formatNonceKey(appId, nonce));
}
public Boolean setNonce(String appId, String nonce, int time, TimeUnit timeUnit) {
return stringRedisTemplate.opsForValue().setIfAbsent(formatNonceKey(appId, nonce), "", time, timeUnit);
}
private static String formatNonceKey(String appId, String nonce) {
return String.format(SIGNATURE_NONCE, appId, nonce);
}
// ========== 签名密钥 ==========
public String getAppSecret(String appId) {
return (String) stringRedisTemplate.opsForHash().get(SIGNATURE_APPID, appId);
}
// ========== 用户套餐使用次数 ==========
/**
* 原子自增用户套餐使用次数
*
* @param key Redis key(USAGE_KEY + apiEndpointId + userId)
* @return 当前使用次数
*/
public Long incrementUsage(String key) {
return stringRedisTemplate.opsForValue().increment(key, 1);
}
/**
* 获取用户套餐已使用次数
*
* @param key Redis key
* @return 使用次数
*/
public Long getUsage(String key) {
String value = stringRedisTemplate.opsForValue().get(key);
if (value == null) {
return 0L;
}
try {
return Long.parseLong(value);
} catch (NumberFormatException e) {
return 0L;
}
}
/**
* 重置用户套餐使用次数(可选,用于测试或套餐刷新)
*/
public void resetUsage(String key) {
stringRedisTemplate.opsForValue().set(key, "0");
}
/**
* 增加用户套餐使用次数,并设置过期时间
*
* @param key Redis key
* @return 当前使用次数
*/
public Integer incrementUsageWithExpire(String key, Long consumptionPoints) {
Integer used = stringRedisTemplate.opsForValue().increment(key, consumptionPoints).intValue();
return used;
}
}
/**
* HTTP API 签名,校验安全性
*
* @see <a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3>微信支付 —— 安全规范</a>
*/
package com.luhu.computility.module.apihub.signature;
\ No newline at end of file
......@@ -10,7 +10,6 @@
<artifactId>computility-module-apihub-biz</artifactId>
<packaging>jar</packaging>
<name>computility-module-apihub-biz</name>
<url>http://maven.apache.org</url>
<properties>
......
......@@ -2,7 +2,6 @@ package com.luhu.computility.module.apihub.api;
import com.luhu.computility.module.apihub.api.apiendpoint.ApiEndpointApi;
import com.luhu.computility.module.apihub.api.apiendpoint.vo.ApiEndpointRespDTO;
import com.luhu.computility.module.apihub.dal.mysql.apicalllog.ApiCallLogMapper;
import com.luhu.computility.module.apihub.dal.mysql.apiendpoint.ApiEndpointMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
......@@ -16,7 +15,7 @@ import javax.annotation.Resource;
*/
@Service
@Validated
public class ApiEndpointServiceImpl implements ApiEndpointApi {
public class ApiEndpointApiServiceImpl implements ApiEndpointApi {
@Resource
private ApiEndpointMapper apiEndpointMapper;
......
......@@ -2,7 +2,7 @@ package com.luhu.computility.module.apihub.controller.admin.apiendpoint;
import com.luhu.computility.module.apihub.controller.admin.apiendpointapplicationrel.vo.ApiEndpointApplicationRelSaveReqVO;
import com.luhu.computility.module.apihub.service.apiendpointapplicationrel.ApiEndpointApplicationRelService;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -52,10 +52,10 @@ public class ApiEndpointController {
@Transactional(rollbackFor = Exception.class)
public CommonResult<Long> createApiEndpoint(@Valid @RequestBody ApiEndpointSaveReqVO createReqVO) {
Long apiEndpointId = apiEndpointService.createApiEndpoint(createReqVO);
for (IndustryApplicationRespVO industryApplicationRespVO : createReqVO.getIndustryApplications()) {
for (IndustryApplicationRespDTO industryApplicationRespDTO : createReqVO.getIndustryApplications()) {
apiEndpointApplicationRelService.createApiEndpointApplicationRel(
new ApiEndpointApplicationRelSaveReqVO()
.setIndustryApplicationId(industryApplicationRespVO.getId())
.setIndustryApplicationId(industryApplicationRespDTO.getId())
.setApiEndpointId(apiEndpointId));
}
return success(apiEndpointId);
......@@ -69,10 +69,10 @@ public class ApiEndpointController {
//删除以前的
apiEndpointApplicationRelService.deleteApiEndpointApplicationRelByApiEndpointId(updateReqVO.getId());
//插入新数据
for (IndustryApplicationRespVO industryApplicationRespVO : updateReqVO.getIndustryApplications()) {
for (IndustryApplicationRespDTO industryApplicationRespDTO : updateReqVO.getIndustryApplications()) {
apiEndpointApplicationRelService.createApiEndpointApplicationRel(
new ApiEndpointApplicationRelSaveReqVO()
.setIndustryApplicationId(industryApplicationRespVO.getId())
.setIndustryApplicationId(industryApplicationRespDTO.getId())
.setApiEndpointId(updateReqVO.getId()));
}
return success(true);
......@@ -108,8 +108,8 @@ public class ApiEndpointController {
public CommonResult<ApiEndpointRespVO> getApiEndpoint(@RequestParam("id") Long id) {
ApiEndpointDO apiEndpoint = apiEndpointService.getApiEndpoint(id);
ApiEndpointRespVO apiEndpointRespVO = BeanUtils.toBean(apiEndpoint, ApiEndpointRespVO.class);
List<IndustryApplicationRespVO> industryApplicationRespVOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(id);
apiEndpointRespVO.setIndustryApplications(industryApplicationRespVOS);
List<IndustryApplicationRespDTO> industryApplicationRespDTOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(id);
apiEndpointRespVO.setIndustryApplications(industryApplicationRespDTOS);
return success(apiEndpointRespVO);
}
......@@ -129,8 +129,8 @@ public class ApiEndpointController {
List<ApiEndpointDO> apiEndpointDOS = apiEndpointService.getApiEndpointList();
List<ApiEndpointRespVO> apiEndpointRespVOS = BeanUtils.toBean(apiEndpointDOS, ApiEndpointRespVO.class);
for (ApiEndpointRespVO apiEndpointRespVO : apiEndpointRespVOS) {
List<IndustryApplicationRespVO> industryApplicationRespVOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(apiEndpointRespVO.getId());
apiEndpointRespVO.setIndustryApplications(industryApplicationRespVOS);
List<IndustryApplicationRespDTO> industryApplicationRespDTOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(apiEndpointRespVO.getId());
apiEndpointRespVO.setIndustryApplications(industryApplicationRespDTOS);
}
return success(apiEndpointRespVOS);
}
......
package com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
......@@ -63,6 +63,6 @@ public class ApiEndpointRespVO {
@Schema(description = "关联行业应用", example = "[{}]")
@ExcelProperty("关联行业应用")
private List<IndustryApplicationRespVO> industryApplications;
private List<IndustryApplicationRespDTO> industryApplications;
}
\ No newline at end of file
package com.luhu.computility.module.apihub.controller.admin.apiendpoint.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
......
......@@ -20,7 +20,7 @@ import com.luhu.computility.module.apihub.service.apicategory.ApiCategoryService
import com.luhu.computility.module.apihub.service.apiendpointapplicationrel.ApiEndpointApplicationRelService;
import com.luhu.computility.module.apihub.service.apiendpointrel.ApiEndpointRelService;
import com.luhu.computility.module.apihub.service.apipackage.ApiPackageService;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
......@@ -81,8 +81,8 @@ public class AppApiController {
List<ApiEndpointRespVO> apiEndpointRespVOS = apiEndpointRelService.getApiEndpointByApiId(id);
for (ApiEndpointRespVO apiEndpointRespVO : apiEndpointRespVOS) {
List<IndustryApplicationRespVO> industryApplicationRespVOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(apiEndpointRespVO.getId());
apiEndpointRespVO.setIndustryApplications(industryApplicationRespVOS);
List<IndustryApplicationRespDTO> industryApplicationRespDTOS = apiEndpointApplicationRelService.getApplicationByApiEndpointId(apiEndpointRespVO.getId());
apiEndpointRespVO.setIndustryApplications(industryApplicationRespDTOS);
}
apiRespVO.setApiEndPoints(apiEndpointRespVOS);
......
......@@ -11,10 +11,10 @@ import com.luhu.computility.module.apihub.dal.dataobject.apiendpoint.ApiEndpoint
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointapplicationrel.ApiEndpointApplicationRelDO;
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointrel.ApiEndpointRelDO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.dal.dataobject.industryapplication.IndustryApplicationDO;
import org.apache.ibatis.annotations.Mapper;
import com.luhu.computility.module.apihub.controller.admin.apiendpointapplicationrel.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 行业应用与接口关联 Mapper
......@@ -37,14 +37,16 @@ public interface ApiEndpointApplicationRelMapper extends BaseMapperX<ApiEndpoint
.eqIfPresent(ApiEndpointApplicationRelDO::getApiEndpointId, apiEndpointId));
}
@Select("SELECT ia.id AS id, ia.title AS title " +
"FROM apihub_api_endpoint_application_rel rel " +
"LEFT JOIN biz_industry_application ia ON rel.industry_application_id = ia.id " +
"WHERE rel.api_endpoint_id = #{apiEndpointId} and rel.deleted = 0 and ia.deleted = 0")
List<IndustryApplicationRespDTO> selectIndustryApplicationByApiId(@Param("apiEndpointId") Long apiEndpointId);
default List<IndustryApplicationRespDTO> getApiEndpointByApiId(Long apiEndpointId) {
return selectJoinList(IndustryApplicationRespDTO.class, new MPJLambdaWrapperX<ApiEndpointApplicationRelDO>()
.selectAs(IndustryApplicationDO::getTitle, IndustryApplicationRespVO::getTitle)
.selectAs(ApiEndpointApplicationRelDO::getIndustryApplicationId, IndustryApplicationRespVO::getId)
.leftJoin(IndustryApplicationDO.class, IndustryApplicationDO::getId, ApiEndpointApplicationRelDO::getIndustryApplicationId)
.eqIfPresent(ApiEndpointApplicationRelDO::getApiEndpointId, apiEndpointId)
);
return this.selectIndustryApplicationByApiId(apiEndpointId);
}
}
\ No newline at end of file
......@@ -8,7 +8,7 @@ import com.luhu.computility.module.apihub.controller.admin.apiendpointapplicatio
import com.luhu.computility.module.apihub.dal.dataobject.apiendpointapplicationrel.ApiEndpointApplicationRelDO;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
/**
* 行业应用与接口关联 Service 接口
......@@ -53,7 +53,7 @@ public interface ApiEndpointApplicationRelService {
* @param apiEndpointId
* @return 行业应用
*/
List<IndustryApplicationRespVO> getApplicationByApiEndpointId(Long apiEndpointId);
List<IndustryApplicationRespDTO> getApplicationByApiEndpointId(Long apiEndpointId);
/**
......
package com.luhu.computility.module.apihub.service.apiendpointapplicationrel;
import com.luhu.computility.module.biz.controller.admin.industryapplication.vo.IndustryApplicationRespVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
......@@ -87,7 +87,7 @@ public class ApiEndpointApplicationRelServiceImpl implements ApiEndpointApplicat
}
@Override
public List<IndustryApplicationRespVO> getApplicationByApiEndpointId(Long apiEndpointId) {
public List<IndustryApplicationRespDTO> getApplicationByApiEndpointId(Long apiEndpointId) {
return apiEndpointApplicationRelMapper.getApiEndpointByApiId(apiEndpointId);
}
......
......@@ -4,13 +4,11 @@
<parent>
<groupId>com.luhu</groupId>
<artifactId>computility-module-biz</artifactId>
<version>2.6.0-jdk8-SNAPSHOT</version>
<version>${revision}</version>
</parent>
<artifactId>computility-module-biz-api</artifactId>
<packaging>jar</packaging>
<name>computility-module-biz-api</name>
<url>http://maven.apache.org</url>
<properties>
......@@ -24,5 +22,9 @@
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-common</artifactId>
</dependency>
</dependencies>
</project>
package com.luhu.computility.module.biz.api.industryapplication;
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.biz.api.industryapplication.dto.IndustryApplicationPageReqVO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationRespDTO;
import com.luhu.computility.module.biz.api.industryapplication.dto.IndustryApplicationSaveReqVO;
import com.luhu.computility.module.biz.dal.dataobject.industryapplication.IndustryApplicationDO;
import com.luhu.computility.module.biz.service.industryapplication.IndustryApplicationService;
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.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 = "管理后台 - 行业应用")
@RestController
@RequestMapping("/biz/industry-application")
@Validated
public class IndustryApplicationController {
@Resource
private IndustryApplicationService industryApplicationService;
@PostMapping("/create")
@Operation(summary = "创建行业应用")
@PreAuthorize("@ss.hasPermission('biz:industry-application:create')")
public CommonResult<Long> createIndustryApplication(@Valid @RequestBody IndustryApplicationSaveReqVO createReqVO) {
return success(industryApplicationService.createIndustryApplication(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新行业应用")
@PreAuthorize("@ss.hasPermission('biz:industry-application:update')")
public CommonResult<Boolean> updateIndustryApplication(@Valid @RequestBody IndustryApplicationSaveReqVO updateReqVO) {
industryApplicationService.updateIndustryApplication(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除行业应用")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('biz:industry-application:delete')")
public CommonResult<Boolean> deleteIndustryApplication(@RequestParam("id") Long id) {
industryApplicationService.deleteIndustryApplication(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Parameter(name = "ids", description = "编号", required = true)
@Operation(summary = "批量删除行业应用")
@PreAuthorize("@ss.hasPermission('biz:industry-application:delete')")
public CommonResult<Boolean> deleteIndustryApplicationList(@RequestParam("ids") List<Long> ids) {
industryApplicationService.deleteIndustryApplicationListByIds(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得行业应用")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('biz:industry-application:query')")
public CommonResult<IndustryApplicationRespDTO> getIndustryApplication(@RequestParam("id") Long id) {
IndustryApplicationDO industryApplication = industryApplicationService.getIndustryApplication(id);
IndustryApplicationRespDTO respVO = BeanUtils.toBean(industryApplication, IndustryApplicationRespDTO.class);
return success(respVO);
}
@GetMapping("/page")
@Operation(summary = "获得行业应用分页")
@PreAuthorize("@ss.hasPermission('biz:industry-application:query')")
public CommonResult<PageResult<IndustryApplicationRespDTO>> getIndustryApplicationPage(@Valid IndustryApplicationPageReqVO pageReqVO) {
PageResult<IndustryApplicationDO> pageResult = industryApplicationService.getIndustryApplicationPage(pageReqVO);
PageResult<IndustryApplicationRespDTO> respResult = BeanUtils.toBean(pageResult, IndustryApplicationRespDTO.class);
return success(respResult);
}
@GetMapping("/list")
@Operation(summary = "获得行业应用分页")
@PreAuthorize("@ss.hasPermission('biz:industry-application:query')")
public CommonResult<List<IndustryApplicationRespDTO>> getIndustryApplicationList() {
List<IndustryApplicationDO> list = industryApplicationService.getAllIndustryApplication(); // 新增Service方法
List<IndustryApplicationRespDTO> result = BeanUtils.toBean(list, IndustryApplicationRespDTO.class);
return success(result);
}
@GetMapping("/export-excel")
@Operation(summary = "导出行业应用 Excel")
@PreAuthorize("@ss.hasPermission('biz:industry-application:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportIndustryApplicationExcel(@Valid IndustryApplicationPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<IndustryApplicationDO> list = industryApplicationService.getIndustryApplicationPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "行业应用.xls", "数据", IndustryApplicationRespDTO.class,
BeanUtils.toBean(list, IndustryApplicationRespDTO.class));
}
}
\ No newline at end of file
package com.luhu.computility.module.biz.api.industryapplication.dto;
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 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 IndustryApplicationPageReqVO extends PageParam {
@Schema(description = "标题")
private String title;
@Schema(description = "状态:0-已隐藏,1-已显示", example = "1")
private Integer showStatus;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "首页展示图片")
private String homeImage;
@Schema(description = "组件类型:0-全部", example = "1")
private Integer type;
@Schema(description = "排序值")
private Integer orderNum;
}
\ No newline at end of file
package com.luhu.computility.module.biz.api.industryapplication.dto;
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.time.LocalDateTime;
@Schema(description = "管理后台 - 行业应用 Response VO")
@Data
@ExcelIgnoreUnannotated
public class IndustryApplicationRespDTO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "展示图地址")
@ExcelProperty("展示图地址")
private String image;
@Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("内容")
private String information;
@Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("标题")
private String title;
@Schema(description = "链接地址", example = "https://www.iocoder.cn")
@ExcelProperty("链接地址")
private String url;
@Schema(description = "描述内容", example = "随便")
@ExcelProperty("描述内容")
private String description;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "首页展示图片")
@ExcelProperty("首页展示图片")
private String homeImage;
@Schema(description = "组件类型:0-全部", example = "1")
@ExcelProperty("组件类型:0-全部")
private Integer type;
@Schema(description = "排序值")
@ExcelProperty("排序值")
private Integer orderNum;
@Schema(description = "状态:0-已隐藏,1-已显示", example = "1")
private Integer showStatus;
}
\ No newline at end of file
package com.luhu.computility.module.biz.api.industryapplication.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 行业应用新增/修改 Request VO")
@Data
public class IndustryApplicationSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21619")
private Long id;
@Schema(description = "展示图地址")
private String image;
@Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "内容不能为空")
private String information;
@Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "标题不能为空")
private String title;
@Schema(description = "链接地址", example = "https://www.iocoder.cn")
private String url;
@Schema(description = "描述内容", example = "随便")
private String description;
@Schema(description = "状态:0-已隐藏,1-已显示", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "状态:0-已隐藏,1-已显示不能为空")
private Integer showStatus;
@Schema(description = "备注", example = "你猜")
private String remark;
@Schema(description = "首页展示图片")
private String homeImage;
@Schema(description = "组件类型:0-全部", example = "1")
private Integer type;
@Schema(description = "排序值")
private Integer orderNum;
}
\ No newline at end of file
package com.luhu.computility.module.biz.enums;
import com.luhu.computility.framework.common.exception.ErrorCode;
/**
* AI 错误码枚举类
* <p>
* ai 系统,使用 1-040-000-000 段
*/
public interface ErrorCodeConstants {
// ========== AI 工作流 1-040-011-000 ==========
ErrorCode INDUSTRY_APPLICATION_NOT_EXISTS = new ErrorCode(1_040_011_000, "行业应用不存在");
ErrorCode BANNER_INFO_NOT_EXISTS = new ErrorCode(1_040_012_000, "首页banner不存在");
ErrorCode COMPUTILITY_INFORMATION_NOT_EXISTS = new ErrorCode(1_040_013_000, "算力资源不存在");
ErrorCode INFORMATION_NOT_EXISTS = new ErrorCode(1_040_014_000, "活动资讯管理不存在");
ErrorCode ORDER_NOT_EXISTS = new ErrorCode(1_040_015_000, "订单管理-需求单管理不存在");
ErrorCode PARTNER_NOT_EXISTS = new ErrorCode(1_040_016_000, "合作伙伴管理不存在");
ErrorCode SOLUTION_NOT_EXISTS = new ErrorCode(1_040_017_000, "解决方案不存在");
ErrorCode GET_SOLUTION_ERROR = new ErrorCode(1_040_017_001, "无法获取详情,请重试!");
}
package com.luhu.computility.module.biz.enums;
/**
* 客户企业审核状态
*/
public enum ShowStatus {
// 请根据实际情况改成对应的值和备注
NO(0, "隐藏"),
YES(1, "展示");
private int value;
private String remark;
private ShowStatus(int value, String remark) {
this.value = value;
this.remark = remark;
}
public int getValue() {
return value;
}
public String getRemark() {
return remark;
}
public static ShowStatus getByValue(int value) {
for (ShowStatus o : ShowStatus.values()) {
if (o.getValue() == value) {
return o;
}
}
return null;
}
}
......@@ -4,13 +4,12 @@
<parent>
<groupId>com.luhu</groupId>
<artifactId>computility-module-biz</artifactId>
<version>2.6.0-jdk8-SNAPSHOT</version>
<version>${revision}</version>
</parent>
<artifactId>computility-module-biz-biz</artifactId>
<packaging>jar</packaging>
<name>computility-module-biz-biz</name>
<url>http://maven.apache.org</url>
<properties>
......@@ -24,6 +23,10 @@
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-common</artifactId>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
......@@ -33,6 +36,12 @@
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-apihub-api</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-trade</artifactId>
<version>${revision}</version>
</dependency>
......
......@@ -20,7 +20,6 @@ import com.luhu.computility.module.trade.controller.admin.order.vo.TradeOrderPag
import com.luhu.computility.module.trade.dal.dataobject.order.TradeOrderDO;
import com.luhu.computility.module.trade.enums.order.TradeOrderStatusEnum;
import com.luhu.computility.module.trade.service.order.TradeOrderQueryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
......
......@@ -75,5 +75,10 @@
<version>${revision}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-apihub-api</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>
......@@ -8,6 +8,7 @@ import com.luhu.computility.framework.common.exception.enums.GlobalResponseCodeC
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.http.HttpUtils;
import com.luhu.computility.framework.signature.core.annotation.ApiSignature;
import com.luhu.computility.module.apihub.signature.core.annotation.ApiHubApiSignature;
import com.luhu.computility.module.external.controller.openapi.dto.ImageRespDTO;
import com.luhu.computility.module.external.controller.openapi.dto.PoetryImageReqDTO;
import com.luhu.computility.module.external.controller.openapi.dto.TextToImageReqDTO;
......@@ -48,7 +49,7 @@ public class AigcNewApiController {
@ApiAccessLog
@PostMapping(value = "/text-to-image/season")
@Operation(summary = "四季和景点id生成图", description = "接收简单生图参数,将生成图片保存在本地服务器,并返回生成图片的url")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ImageRespDTO> textToImageV2(@RequestBody TextToImageReqDTO textToImageReqDTO){
try {
String requestBody = JSONUtil.toJsonStr(textToImageReqDTO);
......@@ -72,7 +73,7 @@ public class AigcNewApiController {
@ApiAccessLog
@PostMapping("/text-to-image/poetry")
@Operation(summary = "获取藏头诗图片", description = "接收关键词、景点id、省份id这些参数,返回藏头诗图片url")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ImageRespDTO> textToImageByPoetry(@RequestBody PoetryImageReqDTO poetryImageReqDTO){
try {
String requestBody = JSONUtil.toJsonStr(poetryImageReqDTO);
......
......@@ -8,6 +8,7 @@ import com.luhu.computility.framework.common.exception.enums.GlobalResponseCodeC
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.util.http.HttpUtils;
import com.luhu.computility.framework.signature.core.annotation.ApiSignature;
import com.luhu.computility.module.apihub.signature.core.annotation.ApiHubApiSignature;
import com.luhu.computility.module.external.controller.openapi.dto.ImageRespDTO;
import com.luhu.computility.module.external.controller.openapi.dto.PoetryImageReqDTO;
import com.luhu.computility.module.external.controller.openapi.dto.TextToImageReqDTO;
......@@ -49,7 +50,7 @@ public class AigcOldApiController {
@ApiAccessLog
@PostMapping(value = "/text-to-image/season")
@Operation(summary = "四季和景点id生成图", description = "接收简单生图参数,将生成图片保存在本地服务器,并返回生成图片的url")
//@ApiSignature
@ApiHubApiSignature
public CommonResult<ImageRespDTO> textToImageBySeason(@RequestBody TextToImageReqDTO textToImageReqDTO){
try {
String requestBody = JSONUtil.toJsonStr(textToImageReqDTO);
......@@ -73,7 +74,7 @@ public class AigcOldApiController {
@ApiAccessLog
@PostMapping("/text-to-image/poetry")
@Operation(summary = "获取藏头诗图片", description = "接收关键词、景点id、省份id这些参数,返回藏头诗图片url")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ImageRespDTO> textToImageByPoetry(@RequestBody PoetryImageReqDTO poetryImageReqDTO){
try {
String requestBody = JSONUtil.toJsonStr(poetryImageReqDTO);
......
......@@ -3,6 +3,7 @@ package com.luhu.computility.module.external.controller.openapi;
import com.luhu.computility.framework.apilog.core.annotation.ApiAccessLog;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.signature.core.annotation.ApiSignature;
import com.luhu.computility.module.apihub.signature.core.annotation.ApiHubApiSignature;
import com.luhu.computility.module.external.controller.openapi.dto.AIQAReqDTO;
import com.luhu.computility.module.external.controller.openapi.dto.AIQARespDTO;
import com.luhu.computility.module.external.controller.openapi.dto.CeateVideoStreamReqDTO;
......@@ -51,7 +52,7 @@ public class OpenApiController {
@ApiAccessLog
@PostMapping(value = "/digital-human-conversation")
@Operation(summary = "数字人对话", description = "和数字人朱熹进行一问一答的对话")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ConversationRespDTO> digitalHumanConversation(@RequestBody ConversationReqDTO conversationReqDTO){
return openApiService.digitalHumanConversation(conversationReqDTO);
}
......@@ -64,7 +65,7 @@ public class OpenApiController {
@Parameter(name = "url", description = "图片链接")
})
@Operation(summary = "ai换脸-上传图片", description = "用户上传头像将视频中人物头像替换")
@ApiSignature
@ApiHubApiSignature
public CommonResult<UploadImageRespDTO> uploadFaceSwapImage(@RequestPart(value = "image", required = false) MultipartFile image,
@RequestParam(value = "url", required = false) String url) {
return openApiService.uploadFaceSwapImage(image, url);
......@@ -74,7 +75,7 @@ public class OpenApiController {
@ApiAccessLog
@GetMapping("/create-video-stream")
@Operation(summary = "ai换脸-生成换脸工作流", description = "只有先上传图片才能开始换脸工作流,用户根据promptId取最后生成的视频")
@ApiSignature
@ApiHubApiSignature
public CommonResult<CeateVideoStreamRespDTO> ceateVideoStream(@RequestBody CeateVideoStreamReqDTO ceateVideoStreamReqDTO){
return openApiService.ceateVideoStream(ceateVideoStreamReqDTO);
}
......@@ -83,7 +84,7 @@ public class OpenApiController {
@ApiAccessLog
@PostMapping(value = "/generate-face-swap-image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "ai换脸-图片换脸:上传图+图片生成", description = "ai换脸-图片换脸:上传图片+图片生成")
@ApiSignature
@ApiHubApiSignature
public CommonResult<GenerateFaceSwapRespDTO> faceImageGenerate(@RequestPart(value = "sourceImage", required = false) MultipartFile sourceImage,
@RequestParam(value = "sourceImageUrl", required = false) String sourceImageUrl,
@RequestPart(value = "targetImage", required = false) MultipartFile targetImage,
......@@ -95,7 +96,7 @@ public class OpenApiController {
@ApiAccessLog
@GetMapping("/view-image")
@Operation(summary = "根据promptId取换脸后的图", description = "根据promptId取换脸后的图")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ViewSourceRespDTO> viewImage(@RequestBody ViewImageReqDTO viewImageReqDTO){
return openApiService.viewImage(viewImageReqDTO);
}
......@@ -108,7 +109,7 @@ public class OpenApiController {
@Parameter(name = "url", description = "图片链接")
})
@Operation(summary = "ai换脸-视频换脸;ai换脸-上传图片+视频流生成", description = "ai换脸-上传图片+视频流生成")
@ApiSignature
@ApiHubApiSignature
public CommonResult<GenerateFaceSwapRespDTO> faceVideoGenerate(@RequestPart(value = "image", required = false) MultipartFile image,
@RequestParam(value = "url", required = false) String url) {
return openApiService.faceVideoGenerate(image, url);
......@@ -118,7 +119,7 @@ public class OpenApiController {
@ApiAccessLog
@GetMapping("/view-video")
@Operation(summary = "根据promptId取最后生成的视频", description = "根据promptId取最后生成的视频")
@ApiSignature
@ApiHubApiSignature
public CommonResult<ViewSourceRespDTO> viewVideo(@RequestBody ViewVideoReqDTO viewVideoReqDTO){
return openApiService.viewVideo(viewVideoReqDTO);
}
......@@ -133,7 +134,7 @@ public class OpenApiController {
@Parameter(name = "touristAreaId", description = "景点编码")
})
@Operation(summary = "图片拍照-相似图查找", description = "图片拍照-相似图查找")
@ApiSignature
@ApiHubApiSignature
public CommonResult<List<MatchImageRespDTO>> matchImage(@RequestPart(value = "image", required = false) MultipartFile image
, @RequestParam(value = "url", required = false) String url
, @RequestParam(value = "limit", required = false) Integer limit
......@@ -147,7 +148,7 @@ public class OpenApiController {
@ApiAccessLog
@PostMapping("/AIQA-chat")
@Operation(summary = "AI问答", description = "AI助手,关于行程和景区的疑问")
@ApiSignature
@ApiHubApiSignature
public CommonResult<AIQARespDTO> AIQAChat(@RequestBody AIQAReqDTO aiqaReqDTO){
return openApiService.AIQAChat(aiqaReqDTO);
}
......
......@@ -89,12 +89,12 @@
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-biz</artifactId>
<artifactId>computility-module-biz-biz</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>com.luhu</groupId>
<artifactId>computility-module-apihub</artifactId>
<artifactId>computility-module-apihub-biz</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
......
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