Commit b75ef888 by zhangxingmin

Initial commit

parents
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\soft\ideaproject\v2\yd-oss\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectStorage">
<option name="path" value="项目群组-&gt;银盾-微服务" />
<option name="projectId" value="4cc05386e898000" />
</component>
</project>
\ No newline at end of file
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="yd-oss-api" />
<module name="yd-oss-feign" />
<module name="yd-oss-service" />
</profile>
</annotationProcessing>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/yd-oss-api/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-oss-api/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-oss-feign/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-oss-feign/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-oss-service/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-oss-service/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="yd-releases" />
<option name="name" value="yd-releases" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="yd-snapshots" />
<option name="name" value="yd-snapshots" />
<option name="url" value="http://139.224.145.34:8081/repository/yd-maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.yd</groupId>
<artifactId>yd-parent-pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.yd</groupId>
<artifactId>yd-oss</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<description>OSS模块</description>
<modules>
<module>yd-oss-api</module>
<module>yd-oss-service</module>
<module>yd-oss-feign</module>
</modules>
<dependencyManagement>
<dependencies>
<!-- 实体类模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-oss-service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-oss-feign</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 部署到Nexus -->
<distributionManagement>
<repository>
<id>yd-releases</id>
<url>http://139.224.145.34:8081/repository/yd-project-releases/</url>
</repository>
<snapshotRepository>
<id>yd-snapshots</id>
<url>http://139.224.145.34:8081/repository/yd-project-snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<!-- 配置Nexus快照仓库,用于拉取快照版本依赖 -->
<repository>
<id>yd-snapshots</id>
<url>http://139.224.145.34:8081/repository/yd-project-snapshots/</url>
<snapshots>
<enabled>true</enabled> <!-- 允许拉取快照版本 -->
</snapshots>
<releases>
<enabled>false</enabled> <!-- 不启用正式版仓库(按需调整) -->
</releases>
</repository>
</repositories>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-oss</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-oss-api</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!--对于bootstrap.properties/bootstrap.yaml配置文件(我们合起来成为Bootstrap配置文件)的支持,需要导入如下的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- Jackson 数据绑定库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<!-- Jackson 注解支持 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
<!-- Java 8 时间类型支持 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<!-- 实体类模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-oss-service</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.oss.api;
import com.yd.common.constant.ServerNameConstants;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication(scanBasePackages = "com.yd")
@MapperScan("com.yd.**.dao")
@EnableFeignClients(basePackages = "com.yd")
public class OssApiApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(OssApiApplication.class)
.properties("spring.application.name="+ ServerNameConstants.ydOssApi)
.build().run(args);
System.out.println("(♥◠‿◠)ノ゙ yd-oss-api启动成功 ლ(´ڡ`ლ)゙ ");
}
}
package com.yd.oss.api.controller;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.client.ApiOssFeignClient;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
* OSS接口信息
*
* @author zxm
* @since 2025-07-31
*/
@RestController
@RequestMapping("/oss")
@Validated
public class ApiOssController implements ApiOssFeignClient {
@Autowired
private ApiOssService apiOssService;
/**
* 上传文件
* @param file 上传的文件
* @return
*/
@Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) {
return apiOssService.uploadFile(file,"","","");
}
/**
* 下载文件
* @param fileKey 文件唯一标识
* @return
*/
@Override
public Result downloadFile(String fileKey) {
apiOssService.downloadFile(fileKey,"","",null);
return Result.success();
}
/**
* 删除文件
* @param fileKey 文件唯一标识
* @return
*/
@Override
public Result<Boolean> deleteFile(String fileKey) {
return apiOssService.deleteFile(fileKey,"","","");
}
/**
* 获取文件URL
* @param fileKey 文件唯一标识
* @param expirySeconds 文件URL过期秒数
* @return
*/
@Override
public Result<String> getFileUrl(String fileKey, Long expirySeconds) {
return apiOssService.getFileUrl(fileKey,"","",expirySeconds);
}
/**
* 切换OSS提供商
* @param providerName OSS提供商名称
* @return
*/
@Override
public Result<Boolean> switchProvider(String providerName) {
return apiOssService.switchProvider(providerName);
}
/**
* 检查文件是否存在
* @param fileKey 文件唯一标识
* @return
*/
@Override
public Result<Boolean> doesFileExist(String fileKey) {
return apiOssService.doesFileExist(fileKey,"","");
}
/**
* 获取文件元数据
* @param fileKey 文件唯一标识
* @return
*/
@Override
public Result<ApiFileMetadataResponse> getFileMetadata(String fileKey) {
return apiOssService.getFileMetadata(fileKey,"","");
}
}
package com.yd.oss.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 文件元数据表 前端控制器
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/ossFile")
public class OssFileController {
}
package com.yd.oss.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 文件操作日志表 前端控制器
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/ossOperationLog")
public class OssOperationLogController {
}
package com.yd.oss.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 云存储服务商配置表 前端控制器
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/ossProvider")
public class OssProviderController {
}
package com.yd.oss.api.service;
import com.yd.common.result.Result;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
public interface ApiOssService {
Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser);
void downloadFile(String fileKey, String bucket, String provider, HttpServletResponse response);
Result<Boolean> deleteFile(String fileKey, String bucket, String provider, String operator);
Result<String> getFileUrl(String fileKey, String bucket, String provider, Long expirySeconds);
Result<Boolean> switchProvider(String providerName);
Result<Boolean> doesFileExist(String fileKey, String bucket, String provider);
Result<ApiFileMetadataResponse> getFileMetadata(String fileKey, String bucket, String provider);
}
package com.yd.oss.api.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.time.Duration;
@Slf4j
@Service
public class ApiOssServiceImpl implements ApiOssService {
@Autowired
private OssService ossService;
/**
* 上传文件
* @param file 上传的文件
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @param uploadUser 上传人用户id
* @return
*/
@Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser) {
ApiUploadResponse response = new ApiUploadResponse();
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 上传文件
String fileKey = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(), bucket, uploadUser);
// 获取上传结果(包含文件信息和访问URL)
UploadResult result = ossService.getUploadResult(fileKey, Duration.ofHours(1));
BeanUtils.copyProperties(result,response);
return Result.success(response);
} catch (IOException e) {
log.error("文件上传失败", e);
return Result.fail("文件上传失败");
}
}
/**
* 下载文件
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @param response
*/
@Override
public void downloadFile(String fileKey, String bucket, String provider, HttpServletResponse response) {
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 下载文件
InputStream inputStream = ossService.downloadFile(fileKey, bucket);
// 设置响应头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileKey + "\"");
// 将文件流写入响应
IOUtils.copy(inputStream, response.getOutputStream());
response.flushBuffer();
} catch (IOException e) {
log.error("文件下载失败: {}", fileKey, e);
throw new RuntimeException("文件下载失败: " + fileKey, e);
}
}
/**
* 删除文件
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @param operator 操作用户
* @return
*/
@Override
public Result<Boolean> deleteFile(String fileKey, String bucket, String provider, String operator) {
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 删除文件
boolean result = ossService.deleteFile(fileKey, bucket, operator);
return Result.success(result);
} catch (Exception e) {
log.error("文件删除失败: {}", fileKey, e);
return Result.fail("文件删除失败: " + e.getMessage());
}
}
/**
* 获取文件URL
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @param expirySeconds url的过期秒数
* @return
*/
@Override
public Result<String> getFileUrl(String fileKey, String bucket, String provider, Long expirySeconds) {
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 获取文件URL
String url = ossService.getFileUrl(fileKey, bucket, Duration.ofSeconds(expirySeconds));
return Result.success(url);
} catch (Exception e) {
log.error("获取文件URL失败: {}", fileKey, e);
return Result.fail("获取文件URL失败: " + e.getMessage());
}
}
/**
* 切换OSS提供商
* @param providerName OSS提供商名称
* @return
*/
@Override
public Result<Boolean> switchProvider(String providerName) {
try {
// 切换OSS提供商
ossService.switchProvider(providerName);
return Result.success(true);
} catch (Exception e) {
log.error("切换OSS提供商失败: {}", providerName, e);
return Result.fail("切换OSS提供商失败: " + e.getMessage());
}
}
/**
* 检查文件是否存在
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @return
*/
@Override
public Result<Boolean> doesFileExist(String fileKey, String bucket, String provider) {
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 检查文件是否存在
boolean exists = ossService.doesFileExist(fileKey, bucket);
return Result.success(exists);
} catch (Exception e) {
log.error("检查文件存在失败: {}", fileKey, e);
return Result.fail("检查文件存在失败: " + e.getMessage());
}
}
/**
* 获取文件元数据
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
* @param provider oss云提供商(不传值使用默认的oss云提供商)
* @return
*/
@Override
public Result<ApiFileMetadataResponse> getFileMetadata(String fileKey, String bucket, String provider) {
ApiFileMetadataResponse response = new ApiFileMetadataResponse();
try {
// 如果指定了提供商,则切换
if (StringUtils.isNotBlank(provider)) {
ossService.switchProvider(provider);
}
// 获取文件元数据
FileMetadata metadata = ossService.getFileMetadata(fileKey, bucket);
BeanUtils.copyProperties(metadata,response);
return Result.success(response);
} catch (Exception e) {
log.error("获取文件元数据失败: {}", fileKey, e);
return Result.fail("获取文件元数据失败: " + e.getMessage());
}
}
}
${AnsiColor.GREEN}
_ _ _ __ __ ____ _ _ _ _
| | (_)_ __ | | _\ \ / /__ / ___| |__ __ _| |_ / \ _ __ (_)
| | | | '_ \| |/ /\ \ /\ / / _ \ | | '_ \ / _` | __| / _ \ | '_ \| |
| |___| | | | | < \ V V / __/ |___| | | | (_| | |_ / ___ \| |_) | |
|_____|_|_| |_|_|\_\ \_/\_/ \___|\____|_| |_|\__,_|\__/_/ \_\ .__/|_|
|_|
${AnsiColor.BRIGHT_WHITE}
Spring Boot Version: ${spring-boot.version}
\ No newline at end of file
spring:
profiles:
active: test
# active: '@spring.profiles.active@'
---
spring:
profiles: dev
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) 4e237601-cea8-414d-b7b9-d7adc8cbcf95
namespace: 22f9d61e-9011-4d45-88cb-24f9857e3eec
# nacos的ip地址和端口 120.79.64.17:10848
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
---
spring:
profiles: test
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: c1e4cbcf-d8b7-4da9-a75a-7b75890fc390
# nacos的ip地址和端口
server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
group: YD_GROUP
refresh: true
extension-configs: # 扩展配置
- data-id: yd-oss-api.yml
group: YD_GROUP
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
group: YD_GROUP
---
spring:
profiles: prod
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ewscrm
# nacos的ip地址和端口
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
refresh: true
group: YD_GROUP
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
#3.2.1\u4EE5\u4E0A\u4F7F\u7528
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1\u4EE5\u4E0B\u4F7F\u7528\u6216\u8005\u4E0D\u914D\u7F6E
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# \u8BBE\u7F6E p6spy driver \u4EE3\u7406
deregisterdrivers=true
# \u53D6\u6D88JDBC URL\u524D\u7F00
useprefix=true
# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# \u65E5\u671F\u683C\u5F0F
dateformat=yyyy-MM-dd HH:mm:ss
# \u5B9E\u9645\u9A71\u52A8\u53EF\u591A\u4E2A
#driverlist=org.h2.Driver
# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
outagedetection=true
# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2
outagedetectioninterval=2
${AnsiColor.GREEN}
_ _ _ __ __ ____ _ _ _ _
| | (_)_ __ | | _\ \ / /__ / ___| |__ __ _| |_ / \ _ __ (_)
| | | | '_ \| |/ /\ \ /\ / / _ \ | | '_ \ / _` | __| / _ \ | '_ \| |
| |___| | | | | < \ V V / __/ |___| | | | (_| | |_ / ___ \| |_) | |
|_____|_|_| |_|_|\_\ \_/\_/ \___|\____|_| |_|\__,_|\__/_/ \_\ .__/|_|
|_|
${AnsiColor.BRIGHT_WHITE}
Spring Boot Version: ${spring-boot.version}
\ No newline at end of file
spring:
profiles:
active: test
# active: '@spring.profiles.active@'
---
spring:
profiles: dev
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空) 4e237601-cea8-414d-b7b9-d7adc8cbcf95
namespace: 22f9d61e-9011-4d45-88cb-24f9857e3eec
# nacos的ip地址和端口 120.79.64.17:10848
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: linkwe-common.yml
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
---
spring:
profiles: test
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: c1e4cbcf-d8b7-4da9-a75a-7b75890fc390
# nacos的ip地址和端口
server-addr: 139.224.145.34:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
group: YD_GROUP
refresh: true
extension-configs: # 扩展配置
- data-id: yd-oss-api.yml
group: YD_GROUP
refresh: true
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
group: YD_GROUP
---
spring:
profiles: prod
main:
allow-bean-definition-overriding: true
allow-circular-references: true
cloud:
nacos:
# 配置中心
config:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ewscrm
# nacos的ip地址和端口
server-addr: 127.0.0.1:8848
# 这个就表示 在我们nacos命名空间id为 dev中 有一个data-id 为 demo-service.yml 的配置文件 读取这个里面的配置
file-extension: yml
config-retry-time: 300000
# 共享配置, 可以把公共配置放在同个命名空间下,然后创建一个 common.yml 文件 ,里面可以放共用的配置
shared-configs[0]:
dataId: yd-common.yml
refresh: true
group: YD_GROUP
# 发布到注册中心 (如果没有使用可以不配)
discovery:
# 命名空间id(此处不用public,因public初始化的空间, id为空)
namespace: ${spring.cloud.nacos.config.namespace}
# nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr}
#3.2.1\u4EE5\u4E0A\u4F7F\u7528
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1\u4EE5\u4E0B\u4F7F\u7528\u6216\u8005\u4E0D\u914D\u7F6E
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# \u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#\u65E5\u5FD7\u8F93\u51FA\u5230\u63A7\u5236\u53F0
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# \u4F7F\u7528\u65E5\u5FD7\u7CFB\u7EDF\u8BB0\u5F55 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# \u8BBE\u7F6E p6spy driver \u4EE3\u7406
deregisterdrivers=true
# \u53D6\u6D88JDBC URL\u524D\u7F00
useprefix=true
# \u914D\u7F6E\u8BB0\u5F55 Log \u4F8B\u5916,\u53EF\u53BB\u6389\u7684\u7ED3\u679C\u96C6\u6709error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# \u65E5\u671F\u683C\u5F0F
dateformat=yyyy-MM-dd HH:mm:ss
# \u5B9E\u9645\u9A71\u52A8\u53EF\u591A\u4E2A
#driverlist=org.h2.Driver
# \u662F\u5426\u5F00\u542F\u6162SQL\u8BB0\u5F55
outagedetection=true
# \u6162SQL\u8BB0\u5F55\u6807\u51C6 2 \u79D2
outagedetectioninterval=2
#Generated by Maven
#Fri Aug 22 16:55:44 CST 2025
version=1.0-SNAPSHOT
groupId=com.yd
artifactId=yd-oss-api
com\yd\oss\api\OssApiApplication.class
com\yd\oss\api\controller\ApiOssController.class
com\yd\oss\api\controller\OssProviderController.class
com\yd\oss\api\service\impl\ApiOssServiceImpl.class
com\yd\oss\api\controller\OssFileController.class
com\yd\oss\api\controller\OssOperationLogController.class
com\yd\oss\api\service\ApiOssService.class
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\controller\OssFileController.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\service\ApiOssService.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\controller\OssOperationLogController.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\controller\ApiOssController.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\OssApiApplication.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\controller\OssProviderController.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-api\src\main\java\com\yd\oss\api\service\impl\ApiOssServiceImpl.java
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-oss</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-oss-feign</artifactId>
<dependencies>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-feign</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.oss.feign.client;
import com.yd.common.result.Result;
import com.yd.oss.feign.fallback.ApiOssFeignFallbackFactory;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.cloud.openfeign.FeignClient;
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.RequestParam;
import org.springframework.web.multipart.MultipartFile;
/**
* OSS服务信息Feign客户端
*/
@FeignClient(name = "yd-user-api", fallbackFactory = ApiOssFeignFallbackFactory.class)
public interface ApiOssFeignClient {
/**
* 上传文件
* @param file 上传的文件
* @return
*/
@PostMapping("/upload")
Result<ApiUploadResponse> uploadFile(@RequestParam("file") MultipartFile file);
/**
* 下载文件
* @param fileKey 文件唯一标识
* @return
*/
@GetMapping("/download")
Result downloadFile(@RequestParam("fileKey") String fileKey);
/**
* 删除文件
* @param fileKey 文件唯一标识
* @return
*/
@DeleteMapping("/delete")
Result<Boolean> deleteFile(@RequestParam("fileKey") String fileKey);
/**
* 获取文件URL
* @param fileKey 文件唯一标识
* @param expirySeconds 文件URL过期秒数
* @return
*/
@GetMapping("/url")
Result<String> getFileUrl(@RequestParam("fileKey") String fileKey,
@RequestParam(value = "expiry", defaultValue = "3600") Long expirySeconds);
/**
* 切换OSS提供商
* @param providerName OSS提供商名称
* @return
*/
@PostMapping("/switch-provider")
Result<Boolean> switchProvider(@RequestParam("providerName") String providerName);
/**
* 检查文件是否存在
* @param fileKey 文件唯一标识
* @return
*/
@GetMapping("/exists")
Result<Boolean> doesFileExist(@RequestParam("fileKey") String fileKey);
/**
* 获取文件元数据
* @param fileKey 文件唯一标识
* @return
*/
@GetMapping("/metadata")
Result<ApiFileMetadataResponse> getFileMetadata(@RequestParam("fileKey") String fileKey);
}
package com.yd.oss.feign.fallback;
import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiOssFeignClient;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
/**
* OSS服务信息Feign降级处理
*/
@Slf4j
@Component
public class ApiOssFeignFallbackFactory implements FallbackFactory<ApiOssFeignClient> {
@Override
public ApiOssFeignClient create(Throwable cause) {
return new ApiOssFeignClient() {
@Override
public Result<ApiUploadResponse> uploadFile(MultipartFile file) {
return null;
}
@Override
public Result downloadFile(String fileKey) {
return null;
}
@Override
public Result<Boolean> deleteFile(String fileKey) {
return null;
}
@Override
public Result<String> getFileUrl(String fileKey, Long expirySeconds) {
return null;
}
@Override
public Result<Boolean> switchProvider(String providerName) {
return null;
}
@Override
public Result<Boolean> doesFileExist(String fileKey) {
return null;
}
@Override
public Result<ApiFileMetadataResponse> getFileMetadata(String fileKey) {
return null;
}
};
}
}
package com.yd.oss.feign.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApiFileMetadataResponse {
/**
* 文件key
*/
private String fileKey;
/**
* 原始文件名
*/
private String originalName;
/**
* 文件大小
*/
private Long fileSize;
/**
* 内容类型
*/
private String contentType;
/**
* 最后修改时间
*/
private Date lastModified;
/**
* ETag
*/
private String etag;
}
package com.yd.oss.feign.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApiUploadResponse {
/**
* 文件key
*/
private String fileKey;
/**
* 访问URL(不带过期时间签名URL)
*/
private String url;
/**
* 访问URL(带过期时间签名URL)
*/
private String accessUrl;
/**
* 文件大小
*/
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
/**
* 原始文件名
*/
private String originalName;
/**
* 上传时间
*/
private Date uploadTime;
}
#Generated by Maven
#Fri Aug 22 16:54:48 CST 2025
version=1.0-SNAPSHOT
groupId=com.yd
artifactId=yd-oss-feign
com\yd\oss\feign\fallback\ApiOssFeignFallbackFactory.class
com\yd\oss\feign\response\ApiUploadResponse.class
com\yd\oss\feign\client\ApiOssFeignClient.class
com\yd\oss\feign\fallback\ApiOssFeignFallbackFactory$1.class
com\yd\oss\feign\response\ApiFileMetadataResponse.class
D:\soft\ideaproject\v2\yd-oss\yd-oss-feign\src\main\java\com\yd\oss\feign\response\ApiFileMetadataResponse.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-feign\src\main\java\com\yd\oss\feign\fallback\ApiOssFeignFallbackFactory.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-feign\src\main\java\com\yd\oss\feign\client\ApiOssFeignClient.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-feign\src\main\java\com\yd\oss\feign\response\ApiUploadResponse.java
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yd-oss</artifactId>
<groupId>com.yd</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>yd-oss-service</artifactId>
<dependencies>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!-- MyBatis Plus 扩展功能 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-oss-feign</artifactId>
</dependency>
<!-- 认证模块 -->
<!-- <dependency>-->
<!-- <groupId>com.yd</groupId>-->
<!-- <artifactId>yd-auth-core</artifactId>-->
<!-- <version>${project.version}</version>-->
<!-- </dependency>-->
<!-- 阿里云 OSS SDK -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
</dependencies>
</project>
//package com.yd.oss.service.config;
//
//import com.aliyun.oss.OSS;
//import com.aliyun.oss.OSSClientBuilder;
//import com.yd.oss.service.properties.OssProperties;
//import com.yd.oss.service.service.OssService;
//import com.yd.oss.service.service.impl.AliYunOssServiceImpl;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Configuration
//public class OssConfiguration {
//
// @Bean
// @ConditionalOnProperty(name = "oss.provider", havingValue = "aliyun")
// public OSS aliOssClient(OssProperties ossProperties) {
// return new OSSClientBuilder().build(
// ossProperties.getEndpoint(),
// ossProperties.getAccessKey(),
// ossProperties.getSecretKey()
// );
// }
//
// @Bean
// @ConditionalOnProperty(name = "oss.provider", havingValue = "aliyun")
// public OssService aliOssTemplate() {
// return new AliYunOssServiceImpl();
// }
//}
//
package com.yd.oss.service.dao;
import com.yd.oss.service.model.OssFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* <p>
* 文件元数据表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface OssFileMapper extends BaseMapper<OssFile> {
// 根据文件key查询文件
@Select("SELECT * FROM oss_file WHERE file_key = #{fileKey}")
OssFile selectByFileKey(@Param("fileKey") String fileKey);
// 根据上传用户查询文件
@Select("SELECT * FROM oss_file WHERE upload_user = #{uploadUser}")
List<OssFile> selectByUploadUser(@Param("uploadUser") String uploadUser);
// 查询所有未删除的文件
@Select("SELECT * FROM oss_file WHERE is_deleted = 0")
List<OssFile> selectActiveFiles();
// 根据提供商ID查询文件
@Select("SELECT * FROM oss_file WHERE provider_id = #{providerId}")
List<OssFile> selectByProviderId(@Param("providerId") Long providerId);
// 标记文件为已删除
@Update("UPDATE oss_file SET is_deleted = true, deleted_time = NOW() WHERE file_key = #{fileKey}")
int markAsDeleted(@Param("fileKey") String fileKey);
}
package com.yd.oss.service.dao;
import com.yd.oss.service.model.OssOperationLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Date;
import java.util.List;
/**
* <p>
* 文件操作日志表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface OssOperationLogMapper extends BaseMapper<OssOperationLog> {
// 根据文件ID查询操作日志
@Select("SELECT * FROM oss_operation_log WHERE file_id = #{fileId} ORDER BY operation_time DESC")
List<OssOperationLog> selectByFileId(@Param("fileId") Long fileId);
// 根据时间范围查询操作日志
@Select("SELECT * FROM oss_operation_log WHERE operation_time BETWEEN #{start} AND #{end} ORDER BY operation_time DESC")
List<OssOperationLog> selectByTimeRange(@Param("start") Date start, @Param("end") Date end);
// 根据操作用户查询操作日志
@Select("SELECT * FROM oss_operation_log WHERE operation_user = #{operationUser} ORDER BY operation_time DESC")
List<OssOperationLog> selectByOperationUser(@Param("operationUser") String operationUser);
}
package com.yd.oss.service.dao;
import com.yd.oss.service.model.OssProvider;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* <p>
* 云存储服务商配置表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface OssProviderMapper extends BaseMapper<OssProvider> {
// 根据名称查询OSS提供商
@Select("SELECT * FROM oss_provider WHERE name = #{name}")
OssProvider selectByName(@Param("name") String name);
// 查询默认的OSS提供商
@Select("SELECT * FROM oss_provider WHERE is_default = 1")
OssProvider selectDefaultProvider();
// 查询所有激活的OSS提供商
@Select("SELECT * FROM oss_provider WHERE is_active = 1")
List<OssProvider> selectActiveProviders();
}
package com.yd.oss.service.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FileMetadata {
private String fileKey; // 文件key
private String originalName; // 原始文件名
private Long fileSize; // 文件大小
private String contentType; // 内容类型
private LocalDateTime lastModified; // 最后修改时间
private String etag; // ETag
}
package com.yd.oss.service.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UploadResult {
private String fileKey; // 文件key
private String url;//访问URL(不带带过期时间签名URL)
private String accessUrl; // 访问URL(带过期时间签名URL)
private Long fileSize; // 文件大小
private String fileType; // 文件类型
private String originalName; // 原始文件名
private LocalDateTime uploadTime; // 上传时间
}
package com.yd.oss.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 文件元数据表
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Getter
@Setter
@TableName("oss_file")
public class OssFile implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 业务ID唯一标识
*/
@TableField("file_biz_id")
private String fileBizId;
/**
* 文件唯一标识
*/
@TableField("file_key")
private String fileKey;
/**
* 原始文件名
*/
@TableField("original_name")
private String originalName;
/**
* 文件大小(字节)
*/
@TableField("file_size")
private Long fileSize;
/**
* 文件类型
*/
@TableField("file_type")
private String fileType;
/**
* 服务商业务ID唯一标识
*/
@TableField("provider_biz_id")
private String providerBizId;
/**
* 存储桶名称
*/
@TableField("bucket_name")
private String bucketName;
/**
* 上传时间
*/
@TableField("upload_time")
private LocalDateTime uploadTime;
/**
* 上传用户业务id
*/
@TableField("upload_user")
private String uploadUser;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.oss.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 文件操作日志表
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Getter
@Setter
@TableName("oss_operation_log")
public class OssOperationLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 文件业务ID唯一标识
*/
@TableField("file_biz_id")
private String fileBizId;
/**
* 操作类型(upload/delete/download/update)
*/
@TableField("operation_type")
private String operationType;
/**
* 操作时间
*/
@TableField("operation_time")
private LocalDateTime operationTime;
/**
* 操作用户
*/
@TableField("operation_user")
private String operationUser;
/**
* 操作结果(success/failure)
*/
@TableField("operation_result")
private String operationResult;
/**
* 错误信息
*/
@TableField("error_message")
private String errorMessage;
/**
* 客户端IP
*/
@TableField("client_ip")
private String clientIp;
/**
* 耗时(毫秒)
*/
@TableField("cost_time")
private Long costTime;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.oss.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 云存储服务商配置表
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Getter
@Setter
@TableName("oss_provider")
public class OssProvider implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 业务ID唯一标识
*/
@TableField("provider_biz_id")
private String providerBizId;
/**
* 服务商编码(业务编码)
*/
@TableField("code")
private String code;
/**
* 服务商名称(阿里云、腾讯云等)
*/
@TableField("name")
private String name;
/**
* 服务端点
*/
@TableField("endpoint")
private String endpoint;
/**
* 访问密钥ID
*/
@TableField("access_key")
private String accessKey;
/**
* 访问密钥
*/
@TableField("secret_key")
private String secretKey;
/**
* 存储桶名称
*/
@TableField("bucket_name")
private String bucketName;
/**
* 区域
*/
@TableField("region")
private String region;
/**
* 是否默认提供商 0-否 1-是
*/
@TableField("is_default")
private Integer isDefault;
/**
* 是否激活 0-否 1-是
*/
@TableField("is_active")
private Integer isActive;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.oss.service.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "oss")
public class OssProperties {
private String provider;
private String endpoint;
private String accessKey;
private String secretKey;
private String defaultBucket;
}
package com.yd.oss.service.service;
import com.yd.oss.service.model.OssFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.oss.service.model.OssOperationLog;
import java.util.List;
/**
* <p>
* 文件元数据表 服务类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface IOssFileService extends IService<OssFile> {
boolean saveFileMetadata(OssFile ossFile);
OssFile getFileByKey(String fileKey);
boolean markFileAsDeleted(String fileKey);
boolean saveOperationLog(OssOperationLog log);
List<OssFile> getUserFiles(String uploadUser);
List<OssFile> getActiveFiles();
List<OssFile> getProviderFiles(Long providerId);
List<OssOperationLog> getOperationLogsByFileId(Long fileId);
}
package com.yd.oss.service.service;
import com.yd.oss.service.model.OssOperationLog;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 文件操作日志表 服务类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface IOssOperationLogService extends IService<OssOperationLog> {
}
package com.yd.oss.service.service;
import com.yd.oss.service.model.OssProvider;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 云存储服务商配置表 服务类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
public interface IOssProviderService extends IService<OssProvider> {
OssProvider getDefaultProvider();
OssProvider getProviderByName(String name);
OssProvider getProviderById(Long id);
List<OssProvider> getActiveProviders();
boolean saveProvider(OssProvider provider);
boolean deleteProvider(Long id);
}
package com.yd.oss.service.service;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.model.OssProvider;
import java.io.InputStream;
import java.time.Duration;
/**
* OSS操作通用接口
*/
public interface OssService {
// 上传文件
String uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser);
// 上传文件(使用默认存储桶)
String uploadFile(InputStream inputStream, String fileName, String uploadUser);
// 下载文件
InputStream downloadFile(String fileKey, String bucketName);
// 下载文件(使用默认存储桶)
InputStream downloadFile(String fileKey);
// 删除文件
boolean deleteFile(String fileKey, String bucketName, String operator);
// 删除文件(使用默认存储桶)
boolean deleteFile(String fileKey, String operator);
// 获取文件URL
String getFileUrl(String fileKey, String bucketName, Duration expiration);
// 获取文件URL(使用默认存储桶)
String getFileUrl(String fileKey, Duration expiration);
// 判断文件是否存在
boolean doesFileExist(String fileKey, String bucketName);
// 判断文件是否存在(使用默认存储桶)
boolean doesFileExist(String fileKey);
// 获取文件元数据
FileMetadata getFileMetadata(String fileKey, String bucketName);
// 获取文件元数据(使用默认存储桶)
FileMetadata getFileMetadata(String fileKey);
// 切换OSS提供商
void switchProvider(String providerName);
// 切换OSS提供商(通过ID)
void switchProvider(Long providerId);
// 获取当前使用的提供商
OssProvider getCurrentProvider();
// 设置默认存储桶
void setDefaultBucket(String bucketName);
// 获取默认存储桶
String getDefaultBucket();
// 获取上传结果(包含文件信息和访问URL)
UploadResult getUploadResult(String fileKey, Duration expiration);
}
package com.yd.oss.service.service.impl;
import com.yd.common.exception.BusinessException;
import com.yd.oss.service.dao.OssOperationLogMapper;
import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.dao.OssFileMapper;
import com.yd.oss.service.model.OssOperationLog;
import com.yd.oss.service.service.IOssFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
* <p>
* 文件元数据表 服务实现类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Slf4j
@Primary
@Service
public class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> implements IOssFileService {
@Autowired
private OssFileMapper ossFileMapper;
@Autowired
private OssOperationLogMapper ossOperationLogMapper;
/**
* 保存文件元数据
* @param ossFile
* @return
*/
@Override
public boolean saveFileMetadata(OssFile ossFile) {
if (ossFile.getId() == null) {
// 新增
ossFile.setUploadTime(LocalDateTime.now());
ossFile.setIsDeleted(0);
return ossFileMapper.insert(ossFile) > 0;
} else {
// 更新
return ossFileMapper.updateById(ossFile) > 0;
}
}
/**
* 根据文件key获取文件
* @param fileKey
* @return
*/
@Override
public OssFile getFileByKey(String fileKey) {
OssFile file = ossFileMapper.selectByFileKey(fileKey);
if (file == null) {
log.error("未找到文件: {}", fileKey);
throw new BusinessException("未找到文件: " + fileKey);
}
return file;
}
/**
* 标记文件为已删除
* @param fileKey
* @return
*/
@Override
public boolean markFileAsDeleted(String fileKey) {
return ossFileMapper.markAsDeleted(fileKey) > 0;
}
/**
* 保存操作日志
* @param log
* @return
*/
@Override
public boolean saveOperationLog(OssOperationLog log) {
return ossOperationLogMapper.insert(log) > 0;
}
/**
* 根据上传用户获取文件列表
* @param uploadUser
* @return
*/
@Override
public List<OssFile> getUserFiles(String uploadUser) {
return ossFileMapper.selectByUploadUser(uploadUser);
}
/**
* 获取所有未删除的文件
* @return
*/
@Override
public List<OssFile> getActiveFiles() {
return ossFileMapper.selectActiveFiles();
}
/**
* 根据提供商ID获取文件列表
* @param providerId
* @return
*/
@Override
public List<OssFile> getProviderFiles(Long providerId) {
return ossFileMapper.selectByProviderId(providerId);
}
/**
* 根据文件ID获取操作日志
* @param fileId
* @return
*/
@Override
public List<OssOperationLog> getOperationLogsByFileId(Long fileId) {
return ossOperationLogMapper.selectByFileId(fileId);
}
}
package com.yd.oss.service.service.impl;
import com.yd.oss.service.model.OssOperationLog;
import com.yd.oss.service.dao.OssOperationLogMapper;
import com.yd.oss.service.service.IOssOperationLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
/**
* <p>
* 文件操作日志表 服务实现类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Slf4j
@Primary
@Service
public class OssOperationLogServiceImpl extends ServiceImpl<OssOperationLogMapper, OssOperationLog> implements IOssOperationLogService {
}
package com.yd.oss.service.service.impl;
import com.yd.common.exception.BusinessException;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.dao.OssProviderMapper;
import com.yd.oss.service.service.IOssProviderService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
* <p>
* 云存储服务商配置表 服务实现类
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@Slf4j
@Primary
@Service
public class OssProviderServiceImpl extends ServiceImpl<OssProviderMapper, OssProvider> implements IOssProviderService {
@Autowired
private OssProviderMapper ossProviderMapper;
/**
* 获取默认的OSS提供商
* @return
*/
@Override
public OssProvider getDefaultProvider() {
OssProvider provider = ossProviderMapper.selectDefaultProvider();
if (provider == null) {
log.error("未找到默认的OSS提供商");
throw new BusinessException("未找到默认的OSS提供商");
}
return provider;
}
/**
* 根据名称获取OSS提供商
* @param name
* @return
*/
@Override
public OssProvider getProviderByName(String name) {
OssProvider provider = ossProviderMapper.selectByName(name);
if (provider == null) {
log.error("未找到名为 {} 的OSS提供商", name);
throw new BusinessException("未找到名为 " + name + " 的OSS提供商");
}
return provider;
}
/**
* 根据ID获取OSS提供商
* @param id
* @return
*/
@Override
public OssProvider getProviderById(Long id) {
OssProvider provider = ossProviderMapper.selectById(id);
if (provider == null) {
log.error("未找到ID为 {} 的OSS提供商", id);
throw new BusinessException("未找到ID为 " + id + " 的OSS提供商");
}
return provider;
}
/**
* 获取所有激活的OSS提供商
* @return
*/
@Override
public List<OssProvider> getActiveProviders() {
return ossProviderMapper.selectActiveProviders();
}
/**
* 保存OSS提供商
* @param provider
* @return
*/
@Override
public boolean saveProvider(OssProvider provider) {
LocalDateTime now = LocalDateTime.now();
if (provider.getId() == null) {
// 新增
provider.setCreateTime(now);
provider.setUpdateTime(now);
return ossProviderMapper.insert(provider) > 0;
} else {
// 更新
provider.setUpdateTime(now);
return ossProviderMapper.updateById(provider) > 0;
}
}
/**
* 删除OSS提供商
* @param id
* @return
*/
@Override
public boolean deleteProvider(Long id) {
return ossProviderMapper.deleteById(id) > 0;
}
}
package com.yd.oss.service.utils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
public class MyBatisPlusCodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/yd?serverTimezone=GMT%2B8", "root", "123456")
.globalConfig(builder -> {
builder.author("zxm")
// .outputDir("src/main/java/com/yd/user/service");
.outputDir("D:/soft/ideaproject/v2/yd-oss/yd-oss-service/src/main/java");
})
.packageConfig(builder -> {
builder.parent("com.yd.oss.service")
.entity("model")
.mapper("dao")
.service("service")
.serviceImpl("service.impl")
.xml("mappers");
})
.strategyConfig(builder -> {
builder.addInclude(
"oss_provider", "oss_file", "oss_operation_log"
)
.entityBuilder()
.enableLombok()
.enableTableFieldAnnotation()
.controllerBuilder()
.enableRestStyle();
})
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssFileMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssOperationLogMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssProviderMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssFileMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssOperationLogMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.OssProviderMapper">
</mapper>
#Generated by Maven
#Fri Aug 22 16:55:28 CST 2025
version=1.0-SNAPSHOT
groupId=com.yd
artifactId=yd-oss-service
com\yd\oss\service\config\OssConfiguration.class
com\yd\oss\service\model\OssOperationLog.class
com\yd\oss\service\dao\OssFileMapper.class
com\yd\oss\service\model\OssProvider.class
com\yd\oss\service\service\impl\OssFileServiceImpl.class
com\yd\oss\service\service\IOssOperationLogService.class
com\yd\oss\service\dao\OssOperationLogMapper.class
com\yd\oss\service\dto\FileMetadata.class
com\yd\oss\service\service\IOssProviderService.class
com\yd\oss\service\service\impl\OssOperationLogServiceImpl.class
com\yd\oss\service\service\IOssFileService.class
com\yd\oss\service\utils\MyBatisPlusCodeGenerator.class
com\yd\oss\service\model\OssFile.class
com\yd\oss\service\service\OssService.class
com\yd\oss\service\service\impl\AliYunOssServiceImpl.class
com\yd\oss\service\properties\OssProperties.class
com\yd\oss\service\dao\OssProviderMapper.class
com\yd\oss\service\dto\UploadResult.class
com\yd\oss\service\service\impl\OssProviderServiceImpl.class
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\dao\OssProviderMapper.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\model\OssProvider.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\IOssFileService.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\dao\OssFileMapper.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\IOssOperationLogService.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\impl\OssProviderServiceImpl.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\impl\OssOperationLogServiceImpl.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\impl\AliYunOssServiceImpl.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\model\OssFile.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\model\OssOperationLog.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\impl\OssFileServiceImpl.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\IOssProviderService.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\service\OssService.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\utils\MyBatisPlusCodeGenerator.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\dao\OssOperationLogMapper.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\dto\UploadResult.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\config\OssConfiguration.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\dto\FileMetadata.java
D:\soft\ideaproject\v2\yd-oss\yd-oss-service\src\main\java\com\yd\oss\service\properties\OssProperties.java
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ 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 to comment