Commit f2afa283 by yuwei

2.0.0项目初始化

parent d56575fe
# 数据源配置 # 数据源配置
spring: spring:
redis:
database: 1
host: 127.0.0.1
port: 6379
password: # 密码(默认为空)
timeout: 6000ms # 连接超时时长(毫秒)
lettuce:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
datasource: datasource:
dynamic: dynamic:
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
...@@ -70,17 +82,10 @@ data: ...@@ -70,17 +82,10 @@ data:
#oss配置 #oss配置
oss: oss:
access-key: tpi8mObnfzZi4ggBX8Bw7zydjoTQ0WeML3RkPKsX access-key: tpi8mObnfzZi4ggBX8Bw7zydjoTQ0WeML3RkPKsX
accessKeySecret: HZBXmSyUTy-haYp0KbBTtsil-GoKjVS2kDKT8Yow access-key-secret: HZBXmSyUTy-haYp0KbBTtsil-GoKjVS2kDKT8Yow
endpoint: http://pkqtmn0p1.bkt.clouddn.com bucket-name: public-oss
bucketName: public-oss domain-name: http://pkqtmn0p1.bkt.clouddn.com
domain:
#local配置 #local配置
local: local:
path: "D:/uploadfile" path: "F:\\uploadfile"
prefix: "fileView" prefix: "fileView"
\ No newline at end of file
#fastDFS配置
#fdfs:
# soTimeout: 1500
# connectTimeout: 600
# trackerList: ${data.fdfs.trackerList}
\ No newline at end of file
...@@ -72,11 +72,6 @@ ...@@ -72,11 +72,6 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>system-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-factory-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
......
...@@ -71,11 +71,6 @@ ...@@ -71,11 +71,6 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>system-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-factory-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
......
...@@ -72,11 +72,6 @@ ...@@ -72,11 +72,6 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>system-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-factory-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
......
...@@ -71,11 +71,6 @@ ...@@ -71,11 +71,6 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>system-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-market-service-api</artifactId> <artifactId>data-market-service-api</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
......
...@@ -12,6 +12,21 @@ ...@@ -12,6 +12,21 @@
<artifactId>file-service-api</artifactId> <artifactId>file-service-api</artifactId>
<dependencies> <dependencies>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<!--feign 依赖--> <!--feign 依赖-->
<dependency> <dependency>
<groupId>io.github.openfeign</groupId> <groupId>io.github.openfeign</groupId>
......
package cn.datax.service.file.api.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class FileDto implements Serializable {
private static final long serialVersionUID=1L;
}
...@@ -23,6 +23,11 @@ public class FileEntity extends BaseEntity { ...@@ -23,6 +23,11 @@ public class FileEntity extends BaseEntity {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
/** /**
* 文件原始名称
*/
private String originalFilename;
/**
* 文件名称 * 文件名称
*/ */
private String fileName; private String fileName;
......
package cn.datax.service.file.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class FileQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String fileName;
}
package cn.datax.service.file.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class FileVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String originalFilename;
private String fileName;
private Long fileSize;
private String filePath;
private String contentType;
private String fileType;
}
...@@ -51,16 +51,6 @@ ...@@ -51,16 +51,6 @@
<version>${fastdfs-client.version}</version> <version>${fastdfs-client.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger2.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId> <groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId> <artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version> <version>${mapstruct.version}</version>
...@@ -79,6 +69,11 @@ ...@@ -79,6 +69,11 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>datax-common-redis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-security</artifactId> <artifactId>datax-common-security</artifactId>
<version>2.0.0</version> <version>2.0.0</version>
</dependency> </dependency>
...@@ -102,5 +97,4 @@ ...@@ -102,5 +97,4 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>
\ No newline at end of file
...@@ -2,7 +2,9 @@ package cn.datax.service.file; ...@@ -2,7 +2,9 @@ package cn.datax.service.file;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign"})
@SpringBootApplication @SpringBootApplication
public class DataxFileApplication { public class DataxFileApplication {
......
package cn.datax.service.file.config; package cn.datax.service.file.config;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.file.api.entity.FileEntity; import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.properties.FileServerProperties; import cn.datax.service.file.properties.FileServerProperties;
import cn.datax.service.file.service.impl.FileServiceImpl; import cn.datax.service.file.service.impl.FileServiceImpl;
import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.common.auth.DefaultCredentialProvider; import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult; import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -15,6 +19,7 @@ import com.aliyun.oss.OSSClient; ...@@ -15,6 +19,7 @@ import com.aliyun.oss.OSSClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
...@@ -24,6 +29,8 @@ import java.io.IOException; ...@@ -24,6 +29,8 @@ import java.io.IOException;
@ConditionalOnProperty(name = "data.file-server.type", havingValue = "aliyun") @ConditionalOnProperty(name = "data.file-server.type", havingValue = "aliyun")
public class AliyunOSSAutoConfig { public class AliyunOSSAutoConfig {
private final Logger logger = LoggerFactory.getLogger(AliyunOSSAutoConfig.class);
@Autowired @Autowired
private FileServerProperties fileProperties; private FileServerProperties fileProperties;
...@@ -33,7 +40,7 @@ public class AliyunOSSAutoConfig { ...@@ -33,7 +40,7 @@ public class AliyunOSSAutoConfig {
*/ */
@Bean @Bean
public OSSClient ossClient() { public OSSClient ossClient() {
OSSClient ossClient = new OSSClient(fileProperties.getOss().getEndpoint() OSSClient ossClient = new OSSClient(fileProperties.getOss().getDomainName()
, new DefaultCredentialProvider(fileProperties.getOss().getAccessKey(), fileProperties.getOss().getAccessKeySecret()) , new DefaultCredentialProvider(fileProperties.getOss().getAccessKey(), fileProperties.getOss().getAccessKeySecret())
, new ClientConfiguration()); , new ClientConfiguration());
return ossClient; return ossClient;
...@@ -52,12 +59,16 @@ public class AliyunOSSAutoConfig { ...@@ -52,12 +59,16 @@ public class AliyunOSSAutoConfig {
@Override @Override
protected void uploadFile(MultipartFile file, FileEntity fileEntity) { protected void uploadFile(MultipartFile file, FileEntity fileEntity) {
try { try {
PutObjectResult result = ossClient.putObject(fileProperties.getOss().getBucketName(), fileEntity.getFileName(), file.getInputStream()); PutObjectRequest putObjectRequest = new PutObjectRequest(fileProperties.getOss().getBucketName(), fileEntity.getFileName(), file.getInputStream());
PutObjectResult result = ossClient.putObject(putObjectRequest);
if(result.getResponse().getStatusCode() == 200){ if(result.getResponse().getStatusCode() == 200){
fileEntity.setFilePath(fileProperties.getOss().getDomain() + "/" + fileEntity.getFileName()); fileEntity.setFilePath(fileProperties.getOss().getDomainName() + File.separator + fileEntity.getFileName());
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); logger.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
} finally {
// 关闭OSSClient
ossClient.shutdown();
} }
} }
......
package cn.datax.service.file.config;
import cn.datax.common.security.handler.DataAccessDeniedHandler;
import cn.datax.common.security.handler.DataAuthExceptionEntryPoint;
import cn.datax.common.security.utils.DataRedisTokenServices;
import cn.datax.common.security.utils.RedisTokenStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DataResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private DataAccessDeniedHandler accessDeniedHandler;
@Autowired
private DataAuthExceptionEntryPoint exceptionEntryPoint;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public TokenStore redisTokenStore() {
return new RedisTokenStore(redisConnectionFactory);
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
DataRedisTokenServices dataTokenServices = new DataRedisTokenServices();
dataTokenServices.setTokenStore(redisTokenStore());
resources
.tokenStore(redisTokenStore())
.tokenServices(dataTokenServices)
.authenticationEntryPoint(exceptionEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
}
@Override
public void configure(HttpSecurity http) throws Exception {
//允许使用iframe 嵌套,避免swagger-ui 不被加载的问题
http.headers().frameOptions().disable();
http.authorizeRequests()
.antMatchers(
"/actuator/**",
"/v2/api-docs/**",
"/swagger-ui.html",
"/doc.html",
"/swagger-resources/**",
"/webjars/**",
// feign 内部调用不用授权
"/inner/**"
).permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
package cn.datax.service.file.config;
import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.properties.FileServerProperties;
import cn.datax.service.file.service.impl.FileServiceImpl;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* FastDFS配置
*/
@Configuration
@ConditionalOnProperty(name = "data.file-server.type", havingValue = "fastdfs")
public class FastdfsAutoConfig {
@Autowired
private FileServerProperties fileProperties;
@Service
public class FastdfsServiceImpl extends FileServiceImpl {
@Autowired
private FastFileStorageClient storageClient;
@Override
protected String fileType() {
return fileProperties.getType();
}
@Override
protected void uploadFile(MultipartFile file, FileEntity fileEntity) {
StorePath storePath = null;
try {
storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
} catch (IOException e) {
e.printStackTrace();
}
// fileEntity.setFilePath("http://" + fileProperties.getFdfs().getWebUrl() + "/" + storePath.getFullPath());
fileEntity.setFilePath(storePath.getFullPath());
}
@Override
protected void deleteFile(FileEntity fileEntity) {
StorePath storePath = StorePath.parseFromUrl(fileEntity.getFilePath());
storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
}
}
}
package cn.datax.service.file.config;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;
import javax.servlet.MultipartConfigElement;
/**
* 文件上传大小设置
*/
@Configuration
public class FileUploadConfig {
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
// 单个文件大小200mb
factory.setMaxFileSize(DataSize.ofMegabytes(200L));
// 设置总上传数据大小1GB
factory.setMaxRequestSize(DataSize.ofGigabytes(1L));
return factory.createMultipartConfig();
}
}
package cn.datax.service.file.config; package cn.datax.service.file.config;
import java.io.File; import java.io.File;
import java.io.IOException;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.file.api.entity.FileEntity; import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.properties.FileServerProperties; import cn.datax.service.file.properties.FileServerProperties;
import cn.datax.service.file.service.impl.FileServiceImpl; import cn.datax.service.file.service.impl.FileServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -22,6 +26,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; ...@@ -22,6 +26,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ConditionalOnProperty(name = "data.file-server.type", havingValue = "local") @ConditionalOnProperty(name = "data.file-server.type", havingValue = "local")
public class LocalFileAutoConfig { public class LocalFileAutoConfig {
private final Logger logger = LoggerFactory.getLogger(LocalFileAutoConfig.class);
@Autowired @Autowired
private FileServerProperties fileProperties; private FileServerProperties fileProperties;
...@@ -49,12 +55,28 @@ public class LocalFileAutoConfig { ...@@ -49,12 +55,28 @@ public class LocalFileAutoConfig {
@Override @Override
protected void uploadFile(MultipartFile file, FileEntity fileEntity) { protected void uploadFile(MultipartFile file, FileEntity fileEntity) {
String localPath = fileProperties.getLocal().getPath();
File parentFile = new File(localPath);
if (!parentFile.exists()) {
if (!parentFile.mkdirs()) {
throw new RuntimeException("创建保存路径失败");
}
}
fileEntity.setFilePath(localPath + File.separator + fileEntity.getFileName());
File dest = new File(localPath + File.separator + fileEntity.getFileName());
try {
file.transferTo(dest);
} catch (IOException e) {
logger.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
}
} }
@Override @Override
protected void deleteFile(FileEntity fileEntity) { protected void deleteFile(FileEntity fileEntity) {
File file = new File(fileEntity.getFilePath());
if (file.exists()) {
file.delete();
}
} }
} }
} }
package cn.datax.service.file.config; package cn.datax.service.file.config;
import cn.datax.common.utils.ThrowableUtil;
import cn.datax.service.file.api.entity.FileEntity; import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.properties.FileServerProperties; import cn.datax.service.file.properties.FileServerProperties;
import cn.datax.service.file.service.impl.FileServiceImpl; import cn.datax.service.file.service.impl.FileServiceImpl;
import com.qiniu.common.QiniuException; import com.qiniu.common.QiniuException;
import com.qiniu.http.Response; import com.qiniu.http.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
...@@ -17,6 +20,7 @@ import com.qiniu.util.Auth; ...@@ -17,6 +20,7 @@ import com.qiniu.util.Auth;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
...@@ -26,6 +30,8 @@ import java.io.IOException; ...@@ -26,6 +30,8 @@ import java.io.IOException;
@ConditionalOnProperty(name = "data.file-server.type", havingValue = "qiniu") @ConditionalOnProperty(name = "data.file-server.type", havingValue = "qiniu")
public class QiniuOSSAutoConfig { public class QiniuOSSAutoConfig {
private final Logger logger = LoggerFactory.getLogger(QiniuOSSAutoConfig.class);
@Autowired @Autowired
private FileServerProperties fileProperties; private FileServerProperties fileProperties;
...@@ -81,28 +87,20 @@ public class QiniuOSSAutoConfig { ...@@ -81,28 +87,20 @@ public class QiniuOSSAutoConfig {
protected void uploadFile(MultipartFile file, FileEntity fileEntity) { protected void uploadFile(MultipartFile file, FileEntity fileEntity) {
try { try {
Response response = uploadManager.put(file.getBytes(), fileEntity.getFileName(), auth.uploadToken(fileProperties.getOss().getBucketName())); Response response = uploadManager.put(file.getBytes(), fileEntity.getFileName(), auth.uploadToken(fileProperties.getOss().getBucketName()));
int retry = 0;
while (response.needRetry() && retry++ < 3) {
response = uploadManager.put(file.getBytes(), fileEntity.getFileName(), auth.uploadToken(fileProperties.getOss().getBucketName()));
}
if (response.statusCode == 200) { if (response.statusCode == 200) {
fileEntity.setFilePath(fileProperties.getOss().getEndpoint() + "/" + fileEntity.getFileName()); fileEntity.setFilePath(fileProperties.getOss().getDomainName() + File.separator + fileEntity.getFileName());
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); logger.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
} }
} }
@Override @Override
protected void deleteFile(FileEntity fileEntity) { protected void deleteFile(FileEntity fileEntity) {
try { try {
Response response = bucketManager.delete(fileProperties.getOss().getBucketName(), fileEntity.getFilePath()); Response response = bucketManager.delete(fileProperties.getOss().getBucketName(), fileEntity.getFileName());
int retry = 0;
while (response.needRetry() && retry++ < 3) {
response = bucketManager.delete(fileProperties.getOss().getBucketName(), fileEntity.getFilePath());
}
} catch (QiniuException e) { } catch (QiniuException e) {
e.printStackTrace(); logger.error("全局异常信息ex={}, StackTrace={}", e.getMessage(), ThrowableUtil.getStackTrace(e));
} }
} }
} }
......
package cn.datax.service.file.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.Parameter;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 创建API应用
* apiInfo() 增加API相关信息
* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
* 本例采用指定扫描的包路径来定义指定要建立API的目录。
*
* @return
*/
@Bean
public Docket createRestApi(){
//版本类型是swagger2
return new Docket(DocumentationType.SWAGGER_2)
//通过调用自定义方法apiInfo,获得文档的主要信息
.apiInfo(apiInfo())
//设置全局参数
.globalOperationParameters(globalParamBuilder())
//设置全局响应参数
.globalResponseMessage(RequestMethod.GET,responseBuilder())
.globalResponseMessage(RequestMethod.POST,responseBuilder())
.globalResponseMessage(RequestMethod.PUT,responseBuilder())
.globalResponseMessage(RequestMethod.DELETE,responseBuilder())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.datax.service.file.controller"))//扫描该包下面的API注解
.paths(PathSelectors.any())
.build()
//设置安全认证
.securitySchemes(security());
}
/**
* 创建该API的基本信息(这些基本信息会展现在文档页面中)
* 访问地址:http://项目实际地址/swagger-ui.html
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("系统管理中心") //接口管理文档首页显示
.description("系统管理中心接口文档") //API的描述
.version("1.0")
.build();
}
/**
* 安全认证参数
* @return
*/
private List<ApiKey> security() {
List<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeys;
}
/**
* 构建全局参数列表
* @return
*/
private List<Parameter> globalParamBuilder(){
List<Parameter> pars = new ArrayList<>();
pars.add(parameterBuilder("Authorization","令牌","string","header",false).build());
return pars;
}
/**
* 创建参数
* @return
*/
private ParameterBuilder parameterBuilder(String name, String desc, String type, String parameterType, boolean required) {
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name(name).description(desc).modelRef(new ModelRef(type)).parameterType(parameterType).required(required).build();
return tokenPar;
}
/**
* 创建全局响应值
* @return
*/
private List<ResponseMessage> responseBuilder() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(200).message("响应成功").build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").build());
return responseMessageList;
}
}
package cn.datax.service.file.controller; package cn.datax.service.file.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.file.api.entity.FileEntity; import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.api.query.FileQuery;
import cn.datax.service.file.api.vo.FileVo;
import cn.datax.service.file.mapstruct.FileMapper;
import cn.datax.service.file.service.FileService; import cn.datax.service.file.service.FileService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
* 前端控制器 * 前端控制器
...@@ -19,34 +31,73 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -19,34 +31,73 @@ import org.springframework.web.multipart.MultipartFile;
* @author yuwei * @author yuwei
* @since 2019-09-17 * @since 2019-09-17
*/ */
@Api(tags = {"文件管理"})
@RestController @RestController
@RequestMapping("/file") @RequestMapping("/files")
public class FileController extends BaseController { public class FileController extends BaseController {
@Autowired @Autowired
private FileService fileService; private FileService fileService;
@Autowired
private FileMapper fileMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}") @GetMapping("/{id}")
public R getFileById(@PathVariable String id) { public R getFileById(@PathVariable String id) {
return R.ok().setData(fileService.getById(id)); return R.ok().setData(fileService.getById(id));
} }
/**
* 分页查询信息
*
* @param fileQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "fileQuery", value = "查询实体fileQuery", required = true, dataTypeClass = FileQuery.class)
})
@GetMapping("/page") @GetMapping("/page")
public R getFilePage(Page page, FileEntity file) { public R getFilePage(FileQuery fileQuery) {
return R.ok().setData(fileService.page(page, Wrappers.query(file))); QueryWrapper<FileEntity> queryWrapper = new QueryWrapper<>();
IPage<FileEntity> page = fileService.page(new Page<>(fileQuery.getPageNum(), fileQuery.getPageSize()), queryWrapper);
List<FileVo> collect = page.getRecords().stream().map(fileMapper::toVO).collect(Collectors.toList());
JsonPage<FileVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
} }
/**
* 附件上传
* @param file
* @return
*/
@ApiOperation(value = "附件上传")
@ApiImplicitParam(name = "file", value = "附件file", required = true, dataTypeClass = MultipartFile.class)
@PostMapping("/upload") @PostMapping("/upload")
public R upload(@RequestParam("file") MultipartFile file) { public R upload(@RequestParam("file") MultipartFile file) {
fileService.uploadFile(file); fileService.uploadFile(file);
return R.ok(); return R.ok();
} }
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public R deleteFile(@PathVariable String id) { public R deleteFileById(@PathVariable String id) {
fileService.deleteFileById(id); fileService.deleteFileById(id);
return R.ok(); return R.ok();
} }
} }
package cn.datax.service.file.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.file.api.dto.FileDto;
import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.api.vo.FileVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据集信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-03-20
*/
@Mapper(componentModel = "spring")
public interface FileMapper extends EntityMapper<FileDto, FileEntity, FileVo> {
}
package cn.datax.service.file.properties;
import lombok.Data;
@Data
public class FdfsProperties {
/**
* fastdfs的http访问地址
*/
private String webUrl;
}
...@@ -13,9 +13,8 @@ import org.springframework.context.annotation.Configuration; ...@@ -13,9 +13,8 @@ import org.springframework.context.annotation.Configuration;
public class FileServerProperties { public class FileServerProperties {
/** /**
* 为以下4个值,指定不同的自动化配置 * 为以下4个值,指定不同的自动化配置
* qiniu:七牛oss * qiniu:七牛oss
* aliyun:阿里云oss * aliyun:阿里云oss
* fastdfs:本地部署的fastDFS
* local:本地盘符部署 * local:本地盘符部署
*/ */
private String type; private String type;
...@@ -26,11 +25,6 @@ public class FileServerProperties { ...@@ -26,11 +25,6 @@ public class FileServerProperties {
OssProperties oss = new OssProperties(); OssProperties oss = new OssProperties();
/** /**
* fastDFS配置
*/
FdfsProperties fdfs = new FdfsProperties();
/**
* local配置 * local配置
*/ */
LocalProperties local = new LocalProperties(); LocalProperties local = new LocalProperties();
......
...@@ -9,7 +9,7 @@ public class LocalProperties { ...@@ -9,7 +9,7 @@ public class LocalProperties {
*/ */
private String path; private String path;
/** /**
* url前缀 * url访问前缀
*/ */
private String prefix; private String prefix;
} }
...@@ -13,15 +13,11 @@ public class OssProperties { ...@@ -13,15 +13,11 @@ public class OssProperties {
*/ */
private String accessKeySecret; private String accessKeySecret;
/** /**
* 端点 * 存储空间名称
*/
private String endpoint;
/**
* bucket名称
*/ */
private String bucketName; private String bucketName;
/** /**
* 说明 * 对象存储绑定的访问主机域名
*/ */
private String domain; private String domainName;
} }
...@@ -4,11 +4,16 @@ import cn.datax.service.file.api.entity.FileEntity; ...@@ -4,11 +4,16 @@ import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.dao.FileDao; import cn.datax.service.file.dao.FileDao;
import cn.datax.service.file.service.FileService; import cn.datax.service.file.service.FileService;
import cn.datax.common.base.BaseServiceImpl; import cn.datax.common.base.BaseServiceImpl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
/** /**
* <p> * <p>
* 服务实现类 * 服务实现类
...@@ -21,25 +26,32 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -21,25 +26,32 @@ import org.springframework.web.multipart.MultipartFile;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public abstract class FileServiceImpl extends BaseServiceImpl<FileDao, FileEntity> implements FileService { public abstract class FileServiceImpl extends BaseServiceImpl<FileDao, FileEntity> implements FileService {
@Autowired
private FileDao fileDao;
@Override @Override
public FileEntity uploadFile(MultipartFile file) { public FileEntity uploadFile(MultipartFile file) {
FileEntity fileEntity = new FileEntity(); FileEntity fileEntity = new FileEntity();
fileEntity.setContentType(file.getContentType()) fileEntity.setContentType(file.getContentType())
.setFileName(file.getOriginalFilename()) .setOriginalFilename(file.getOriginalFilename())
.setFileSize(file.getSize()); .setFileSize(file.getSize());
String nowDate = DateUtil.format(new Date(), "yyyyMMddHHmmss");
String extName = FileUtil.extName(fileEntity.getOriginalFilename());
String fileName = nowDate + "." + extName;
fileEntity.setFileName(fileName);
uploadFile(file, fileEntity); uploadFile(file, fileEntity);
// 设置文件来源 // 设置文件来源
fileEntity.setFileType(fileType()); fileEntity.setFileType(fileType());
// 将文件信息保存到数据库 // 将文件信息保存到数据库
baseMapper.insert(fileEntity); fileDao.insert(fileEntity);
return fileEntity; return fileEntity;
} }
@Override @Override
public void deleteFileById(String id) { public void deleteFileById(String id) {
FileEntity fileEntity = baseMapper.selectById(id); FileEntity fileEntity = fileDao.selectById(id);
if (fileEntity != null) { if (fileEntity != null) {
baseMapper.deleteById(fileEntity.getId()); fileDao.deleteById(fileEntity.getId());
deleteFile(fileEntity); deleteFile(fileEntity);
} }
} }
...@@ -66,5 +78,4 @@ public abstract class FileServiceImpl extends BaseServiceImpl<FileDao, FileEntit ...@@ -66,5 +78,4 @@ public abstract class FileServiceImpl extends BaseServiceImpl<FileDao, FileEntit
* @return * @return
*/ */
protected abstract void deleteFile(FileEntity fileEntity); protected abstract void deleteFile(FileEntity fileEntity);
} }
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
<result column="create_time" property="createTime" /> <result column="create_time" property="createTime" />
<result column="update_by" property="updateBy" /> <result column="update_by" property="updateBy" />
<result column="update_time" property="updateTime" /> <result column="update_time" property="updateTime" />
<result column="original_filename" property="originalFilename" />
<result column="file_name" property="fileName" /> <result column="file_name" property="fileName" />
<result column="file_size" property="fileSize" /> <result column="file_size" property="fileSize" />
<result column="file_path" property="filePath" /> <result column="file_path" property="filePath" />
...@@ -25,7 +26,7 @@ ...@@ -25,7 +26,7 @@
create_time, create_time,
update_by, update_by,
update_time, update_time,
file_name, file_size, file_path, content_type, file_type original_filename, file_name, file_size, file_path, content_type, file_type
</sql> </sql>
</mapper> </mapper>
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 to comment