Commit b1963082 by zhangxingmin

Update .gitignore and stop tracking ignored files

parent b24ce8c6
### 通用开发环境 ###
# IDE 配置
.idea/
.vscode/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# 编辑器临时文件
*~
~$*
*.tmp
*.bak
*.swp
### 操作系统文件 ###
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*
.Spotlight-V100
.Trashes
# Windows
Thumbs.db
ehthumbs.db
[Dd]esktop.ini
$RECYCLE.BIN/
# Linux
.directory
.trash-*
### 编程语言相关 ###
# Java
*.class
*.jar
*.war
*.ear
*.log
target/
build/
out/
bin/
# Python
__pycache__/
*.pyc
*.pyo
*.pyd
*.pyc
env/
venv/
.python-version
# Node.js
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnp/
.pnp.js
# C/C++
*.o
*.ko
*.obj
*.exe
*.dll
*.so
*.dylib
# Rust
/target/
**/*.rs.bk
### 构建系统 ###
# Maven
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
# Gradle
.gradle/
build/
!gradle/wrapper/gradle-wrapper.jar
# Android
*.apk
*.ap_
*.dex
*.class
gen/
bin/
### 日志文件 ###
*.log
logs/
*.logs
### 测试文件 ###
coverage/
.nyc_output/
test-results/
### 系统文件 ###
*.cab
*.msi
*.msix
*.msm
*.msp
### 文档文件 ###
*.pdf
*.doc
*.docx
*.xls
*.xlsx
*.ppt
*.pptx
### 压缩文件 ###
*.zip
*.tar.gz
*.7z
*.rar
*.gz
### 自定义规则 ###
# 项目特定文件
.env
config.local.yml
secrets.ini
# 临时文件
temp/
tmp/
dump.rdb
# 大文件
*.large
*.h5
*.dat
# 排除特定文件
**/pom.properties
**/inputFiles.lst
**/createdFiles.lst
# 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
package com.yd.oss.api.controller;
import com.yd.oss.feign.client.ApiPdfFeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* PDF接口
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/pdf")
@Validated
public class ApiPdfController implements ApiPdfFeignClient {
}
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-09-10
*/
@RestController
@RequestMapping("/fileTemplate")
public class FileTemplateController {
}
${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
package com.yd.oss.feign.client;
import com.yd.oss.feign.fallback.ApiPdfFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
/**
* PDF信息Feign客户端
*/
@FeignClient(name = "yd-user-api", fallbackFactory = ApiPdfFeignFallbackFactory.class)
public interface ApiPdfFeignClient {
}
package com.yd.oss.feign.fallback;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* PDF信息Feign降级处理
*/
@Slf4j
@Component
public class ApiPdfFeignFallbackFactory {
}
#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
......@@ -72,5 +72,28 @@
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
</dependency>
<!-- Apache POI for Word 处理 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.oss.service.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PdfField {
String value() default "";
}
package com.yd.oss.service.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssProviderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.annotation.PostConstruct;
@Configuration
@Slf4j
public class OssConfig {
@Autowired
private IOssProviderService ossProviderService;
private OssProvider currentProvider;
private String defaultBucket;
@PostConstruct
public void init() {
try {
this.currentProvider = ossProviderService.getDefaultProvider();
this.defaultBucket = currentProvider.getBucketName();
log.info("默认OSS提供商初始化成功: {}", currentProvider.getName());
} catch (Exception e) {
log.error("默认OSS提供商初始化失败", e);
throw new RuntimeException("默认OSS提供商初始化失败", e);
}
}
@Bean
@Primary
public OSS ossClient() {
return new OSSClientBuilder().build(
currentProvider.getEndpoint(),
currentProvider.getAccessKey(),
currentProvider.getSecretKey()
);
}
@Bean
public String defaultBucket() {
return defaultBucket;
}
@Bean
public OssProvider currentProvider() {
return currentProvider;
}
}
//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.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
@Configuration
public class OssMybatisPlusConfig {
/**
* 分页插件配置(必须)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 使用正确的枚举值 DbType.MYSQL
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
/**
* 自动填充字段配置(如创建时间、更新时间)
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
return new MetaObjectHandler() {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
};
}
}
package com.yd.oss.service.dao;
import com.yd.oss.service.dto.FileProdDto;
import com.yd.oss.service.model.FileTemplate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 文件模板表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-09-10
*/
public interface FileTemplateMapper extends BaseMapper<FileTemplate> {
FileProdDto getFileProd(@Param("templateName") String templateName,
@Param("templateType") String templateType);
}
package com.yd.oss.service.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
@Data
public class FileProdDto {
/**
* 业务ID唯一标识
*/
private String fileBizId;
/**
* 文件唯一标识
*/
private String fileKey;
/**
* 存储桶名称
*/
private String bucketName;
/**
* 模板字段映射配置(JSON格式)
*/
private String fieldMapping;
}
package com.yd.oss.service.enums;
/**
* 文件模板类型类型枚举
*/
public enum TemplateTypeEnum {
//文件模板类型类型枚举
XCD("保险行程单","XCD"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
TemplateTypeEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
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-09-10
*/
@Getter
@Setter
@TableName("file_template")
public class FileTemplate implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 模板ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 文件元数据表业务ID唯一标识
*/
@TableField("file_biz_id")
private String fileBizId;
/**
* 文件模板业务ID唯一标识
*/
@TableField("template_biz_id")
private String templateBizId;
/**
* 模板名称
*/
@TableField("template_name")
private String templateName;
/**
* 模板描述
*/
@TableField("template_description")
private String templateDescription;
/**
* 文件类型: 0-PDF, 1-EXCEL, 2-WORD
*/
@TableField("file_type")
private Integer fileType;
/**
* 模板类型(如:保险行程单,合同等)
*/
@TableField("template_type")
private String templateType;
/**
* 状态(0:禁用,1:启用)
*/
@TableField("status")
private Integer status;
/**
* 字段映射配置(JSON格式)
*/
@TableField("field_mapping")
private String fieldMapping;
/**
* 通用备注
*/
@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.service;
public interface FieldValueProvider<T> {
String getFieldValue(T object, String fieldName);
}
package com.yd.oss.service.service;
import com.yd.oss.service.dto.FileProdDto;
import com.yd.oss.service.model.FileTemplate;
import com.baomidou.mybatisplus.extension.service.IService;
import java.io.InputStream;
/**
* <p>
* 文件模板表 服务类
* </p>
*
* @author zxm
* @since 2025-09-10
*/
public interface IFileTemplateService extends IService<FileTemplate> {
InputStream getTemplateInputStreamFromOSS(String bucketName, String objectKey);
FileProdDto getFileProd(String templateName, String templateType);
FileTemplate queryOne(String templateBizId,String templateType);
}
package com.yd.oss.service.service;
import java.io.IOException;
public interface PdfService<T> {
String generatePDF(T dataObject,String objectId, String templateType) throws IOException;
}
......@@ -2,7 +2,6 @@ package com.yd.oss.service.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
......@@ -23,7 +22,6 @@ import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.net.URL;
......@@ -44,39 +42,14 @@ public class AliYunOssServiceImpl implements OssService {
@Autowired
private IOssFileService ossFileService;
private OSS ossClient; // 阿里云OSS客户端
private OssProvider currentProvider; // 当前使用的OSS提供商
private String defaultBucket; // 默认存储桶
@Autowired
private OSS ossClient; // 注入OSS客户端
/**
* 初始化时使用默认的OSS提供商
*/
@PostConstruct
public void init() {
try {
// 初始化时使用默认的OSS提供商
this.currentProvider = ossProviderService.getDefaultProvider();
this.ossClient = createOssClient(currentProvider);
this.defaultBucket = currentProvider.getBucketName();
log.info("阿里云OSS客户端初始化成功,使用提供商: {}", currentProvider.getName());
} catch (Exception e) {
log.error("阿里云OSS客户端初始化失败", e);
throw new RuntimeException("阿里云OSS客户端初始化失败", e);
}
}
@Autowired
private String defaultBucket; // 注入默认存储桶
/**
* 创建阿里云OSS客户端
* @param provider
* @return
*/
private OSS createOssClient(OssProvider provider) {
return new OSSClientBuilder().build(
provider.getEndpoint(), // 服务端点
provider.getAccessKey(), // 访问密钥ID
provider.getSecretKey() // 访问密钥
);
}
@Autowired
private OssProvider currentProvider; // 注入当前提供商
/**
* 上传文件
......@@ -504,7 +477,11 @@ public class AliYunOssServiceImpl implements OssService {
// 创建新的客户端
this.currentProvider = provider;
this.ossClient = createOssClient(provider);
this.ossClient = new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
this.defaultBucket = provider.getBucketName();
}
......
package com.yd.oss.service.service.impl;
import com.yd.oss.service.annotation.PdfField;
import com.yd.oss.service.service.FieldValueProvider;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
/**
* 使用注解实现通用字段值提供器
* @param <T>
*/
@Component
public class AnnotationFieldValueProvider<T> implements FieldValueProvider<T> {
@Override
public String getFieldValue(T object, String fieldName) {
try {
// 获取所有字段
Field[] fields = object.getClass().getDeclaredFields();
for (Field field : fields) {
PdfField annotation = field.getAnnotation(PdfField.class);
if (annotation != null && annotation.value().equals(fieldName)) {
field.setAccessible(true);
Object value = field.get(object);
return value != null ? value.toString() : "";
}
}
// 如果没有找到注解,尝试使用字段名
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Object value = field.get(object);
return value != null ? value.toString() : "";
} catch (NoSuchFieldException e) {
return "";
}
} catch (Exception e) {
return "";
}
}
}
package com.yd.oss.service.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.oss.service.dto.FileProdDto;
import com.yd.oss.service.model.FileTemplate;
import com.yd.oss.service.dao.FileTemplateMapper;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IFileTemplateService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.oss.service.service.IOssProviderService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.InputStream;
/**
* <p>
* 文件模板表 服务实现类
* </p>
*
* @author zxm
* @since 2025-09-10
*/
@Service
@Primary
@Slf4j
public class FileTemplateServiceImpl extends ServiceImpl<FileTemplateMapper, FileTemplate> implements IFileTemplateService {
@Autowired
private IOssProviderService ossProviderService;
@Autowired
private OSS ossClient; // 注入OSS客户端
/**
* 根据模板名称和模板类型获取云服务商和文件信息
* @param templateName
* @param templateType
* @return
*/
public FileProdDto getFileProd(String templateName,String templateType){
return baseMapper.getFileProd(templateName,templateType);
}
/**
* 获取模板文件的InputStream
* @param bucketName
* @param objectKey
* @return
*/
public InputStream getTemplateInputStreamFromOSS(String bucketName, String objectKey) {
OSSObject object = ossClient.getObject(bucketName, objectKey);
return object.getObjectContent();
}
/**
* 根据模板业务id和模板类型获取单个对象
* @param templateBizId
* @param templateType
* @return
*/
@Override
public FileTemplate queryOne(String templateBizId,String templateType) {
return this.getOne(new LambdaQueryWrapper<FileTemplate>()
.eq(StringUtils.isNotBlank(templateBizId),FileTemplate::getTemplateBizId,templateBizId)
.eq(StringUtils.isNotBlank(templateType),FileTemplate::getTemplateType,templateType));
}
}
......@@ -127,4 +127,6 @@ public class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> impl
public List<OssOperationLog> getOperationLogsByFileId(Long fileId) {
return ossOperationLogMapper.selectByFileId(fileId);
}
}
......@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
})
.strategyConfig(builder -> {
builder.addInclude(
"oss_provider", "oss_file", "oss_operation_log"
"file_template"
)
.entityBuilder()
.enableLombok()
......
package com.yd.oss.service.utils;
import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
@Slf4j
public class PdfUtil {
/**
* windows系统word转pdf
* @param pdfFile 转换后的pdf文件
* @param wordFile word源文件
*/
public static void winWordToPdf(File pdfFile, File wordFile) {
try {
IConverter converter = LocalConverter.builder().build();
converter.convert(new FileInputStream(wordFile))
.as(DocumentType.DOCX)
.to(new FileOutputStream(pdfFile))
.as(DocumentType.PDF).execute();
} catch (FileNotFoundException e) {
log.error("word转换pdf失败", e);
}
}
/**
* linux系统word转pdf   * 使用LibreOffice转换。系统需安装LibreOffice   * 转换命令 libreoffice --invisible --convert-to pdf --outdir output_dir source_path   * 转换后的pdf文件名使用的是源文件的名称,所以如果要指定输出文件名称,就需把源文件名称改成想要输出的名称
* @param pdfFile 转换后的pdf文件
* @param wordFile word源文件
*/
public static void linuxWordToPdf(File pdfFile, File wordFile) {
// 获取word文件的绝对路径
String sourcePath = wordFile.getAbsolutePath();// 获取pdf文件存放文件夹的绝对路径
String outDir = pdfFile.getAbsolutePath().substring(0, pdfFile.getAbsolutePath().lastIndexOf(File.separator));
// 构建LibreOffice的命令行工具命令
String command = "libreoffice --invisible --convert-to pdf --outdir " + outDir + " " + sourcePath;
log.info(command);
// 执行转换命令
try {
executeLinuxCmd(command);
} catch (Exception e) {
log.error("linuxWordToPdf linux环境word转换为pdf时出现异常:", e);
}
}
/**
* 执行命令行
*
* @param cmd 命令行
* @return
*/
private static boolean executeLinuxCmd(String cmd) {
try {
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
} catch (InterruptedException e) {
log.error("executeLinuxCmd 执行Linux命令异常:", e);
Thread.currentThread().interrupt();
return false;
} catch (IOException e) {
log.error("获取系统命令执行环境异常", e);
}
return true;
}
public static void main(String[] args) {
// 待转换的word文件
File wordFile = new File("D:\\wjzh\\xcd.docx");
// 转换后的pdf文件
File pdfFile = new File("D:\\wjzh\\zhxcd.pdf");
// 获取当前系统名称
String osName = System.getProperty("os.name").toLowerCase();
// 根据系统选择执行方法
if (osName.contains("win")) {
PdfUtil.winWordToPdf(pdfFile, wordFile);
} else if (osName.contains("nux") || osName.contains("nix")) {
PdfUtil.linuxWordToPdf(pdfFile, wordFile);
}
}
}
<?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.FileTemplateMapper">
<select id="getFileProd" resultType="com.yd.oss.service.dto.FileProdDto">
select * from
file_template f
left join oss_file o on o.file_biz_id = f.file_biz_id and o.is_deleted = 0
left join oss_provider p on p.provider_biz_id = o.provider_biz_id and p.is_deleted = 0
<where>
<if test="templateName != null and templateName != ''">
and f.template_name = #{templateName}
</if>
<if test="templateType != null and templateType != ''">
and f.template_type = #{templateType}
</if>
and f.is_deleted = 0
</where>
limit 1
</select>
</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
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