mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	Merge branch 'master-jdk21' of https://gitee.com/zhijiantianya/ruoyi-vue-pro
# Conflicts: # yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/db/DatabaseDocController.java
This commit is contained in:
		@ -465,22 +465,6 @@
 | 
			
		||||
                <version>${fastjson.version}</version>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>cn.smallbun.screw</groupId>
 | 
			
		||||
                <artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
 | 
			
		||||
                <version>${screw.version}</version>
 | 
			
		||||
                <exclusions>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <groupId>org.freemarker</groupId>
 | 
			
		||||
                        <artifactId>freemarker</artifactId> <!-- 移除 Freemarker 依赖,采用 Velocity 作为模板引擎 -->
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                    <exclusion>
 | 
			
		||||
                        <groupId>com.alibaba</groupId>
 | 
			
		||||
                        <artifactId>fastjson</artifactId> <!-- 最新版screw-core1.0.5依赖fastjson1.2.73存在漏洞,移除。 -->
 | 
			
		||||
                    </exclusion>
 | 
			
		||||
                </exclusions>
 | 
			
		||||
            </dependency>
 | 
			
		||||
 | 
			
		||||
            <dependency>
 | 
			
		||||
                <groupId>com.google.guava</groupId>
 | 
			
		||||
                <artifactId>guava</artifactId>
 | 
			
		||||
 | 
			
		||||
@ -95,11 +95,6 @@
 | 
			
		||||
            <artifactId>velocity-engine-core</artifactId> <!-- 实现代码生成 -->
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.smallbun.screw</groupId>
 | 
			
		||||
            <artifactId>screw-core</artifactId> <!-- 实现数据库文档 -->
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- 监控相关 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.iocoder.boot</groupId>
 | 
			
		||||
 | 
			
		||||
@ -1,154 +0,0 @@
 | 
			
		||||
package cn.iocoder.yudao.module.infra.controller.admin.db;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.io.FileUtil;
 | 
			
		||||
import cn.hutool.core.util.IdUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
 | 
			
		||||
import cn.smallbun.screw.core.Configuration;
 | 
			
		||||
import cn.smallbun.screw.core.engine.EngineConfig;
 | 
			
		||||
import cn.smallbun.screw.core.engine.EngineFileType;
 | 
			
		||||
import cn.smallbun.screw.core.engine.EngineTemplateType;
 | 
			
		||||
import cn.smallbun.screw.core.execute.DocumentationExecute;
 | 
			
		||||
import cn.smallbun.screw.core.process.ProcessConfig;
 | 
			
		||||
import com.baomidou.dynamic.datasource.creator.DataSourceProperty;
 | 
			
		||||
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
 | 
			
		||||
import com.zaxxer.hikari.HikariConfig;
 | 
			
		||||
import com.zaxxer.hikari.HikariDataSource;
 | 
			
		||||
import io.swagger.v3.oas.annotations.Operation;
 | 
			
		||||
import io.swagger.v3.oas.annotations.Parameter;
 | 
			
		||||
import io.swagger.v3.oas.annotations.tags.Tag;
 | 
			
		||||
import org.springframework.web.bind.annotation.GetMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestParam;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import javax.servlet.http.HttpServletResponse;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
 | 
			
		||||
@Tag(name = "管理后台 - 数据库文档")
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/infra/db-doc")
 | 
			
		||||
public class DatabaseDocController {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private DynamicDataSourceProperties dynamicDataSourceProperties;
 | 
			
		||||
 | 
			
		||||
    private static final String FILE_OUTPUT_DIR = System.getProperty("java.io.tmpdir") + File.separator
 | 
			
		||||
            + "db-doc";
 | 
			
		||||
    private static final String DOC_FILE_NAME = "数据库文档";
 | 
			
		||||
    private static final String DOC_VERSION = "1.0.0";
 | 
			
		||||
    private static final String DOC_DESCRIPTION = "文档描述";
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/export-html")
 | 
			
		||||
    @Operation(summary = "导出 html 格式的数据文档")
 | 
			
		||||
    @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true")
 | 
			
		||||
    public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile,
 | 
			
		||||
                           HttpServletResponse response) throws IOException {
 | 
			
		||||
        doExportFile(EngineFileType.HTML, deleteFile, response);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/export-word")
 | 
			
		||||
    @Operation(summary = "导出 word 格式的数据文档")
 | 
			
		||||
    @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true")
 | 
			
		||||
    public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile,
 | 
			
		||||
                           HttpServletResponse response) throws IOException {
 | 
			
		||||
        doExportFile(EngineFileType.WORD, deleteFile, response);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @GetMapping("/export-markdown")
 | 
			
		||||
    @Operation(summary = "导出 markdown 格式的数据文档")
 | 
			
		||||
    @Parameter(name = "deleteFile", description = "是否删除在服务器本地生成的数据库文档", example = "true")
 | 
			
		||||
    public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile,
 | 
			
		||||
                               HttpServletResponse response) throws IOException {
 | 
			
		||||
        doExportFile(EngineFileType.MD, deleteFile, response);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void doExportFile(EngineFileType fileOutputType, Boolean deleteFile,
 | 
			
		||||
                              HttpServletResponse response) throws IOException {
 | 
			
		||||
        String docFileName = DOC_FILE_NAME + "_" + IdUtil.fastSimpleUUID();
 | 
			
		||||
        String filePath = doExportFile(fileOutputType, docFileName);
 | 
			
		||||
        String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名
 | 
			
		||||
        try {
 | 
			
		||||
            // 读取,返回
 | 
			
		||||
            ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath));
 | 
			
		||||
        } finally {
 | 
			
		||||
            handleDeleteFile(deleteFile, filePath);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 输出文件,返回文件路径
 | 
			
		||||
     *
 | 
			
		||||
     * @param fileOutputType 文件类型
 | 
			
		||||
     * @param fileName       文件名, 无需 ".docx" 等文件后缀
 | 
			
		||||
     * @return 生成的文件所在路径
 | 
			
		||||
     */
 | 
			
		||||
    private String doExportFile(EngineFileType fileOutputType, String fileName) {
 | 
			
		||||
        try (HikariDataSource dataSource = buildDataSource()) {
 | 
			
		||||
            // 创建 screw 的配置
 | 
			
		||||
            Configuration config = Configuration.builder()
 | 
			
		||||
                    .version(DOC_VERSION)  // 版本
 | 
			
		||||
                    .description(DOC_DESCRIPTION) // 描述
 | 
			
		||||
                    .dataSource(dataSource) // 数据源
 | 
			
		||||
                    .engineConfig(buildEngineConfig(fileOutputType, fileName)) // 引擎配置
 | 
			
		||||
                    .produceConfig(buildProcessConfig()) // 处理配置
 | 
			
		||||
                    .build();
 | 
			
		||||
 | 
			
		||||
            // 执行 screw,生成数据库文档
 | 
			
		||||
            new DocumentationExecute(config).execute();
 | 
			
		||||
 | 
			
		||||
            return FILE_OUTPUT_DIR + File.separator + fileName + fileOutputType.getFileSuffix();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void handleDeleteFile(Boolean deleteFile, String filePath) {
 | 
			
		||||
        if (!deleteFile) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        FileUtil.del(filePath);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建数据源
 | 
			
		||||
     */
 | 
			
		||||
    // TODO 芋艿:screw 暂时不支持 druid,尴尬
 | 
			
		||||
    private HikariDataSource buildDataSource() {
 | 
			
		||||
        // 获得 DataSource 数据源,目前只支持首个
 | 
			
		||||
        String primary = dynamicDataSourceProperties.getPrimary();
 | 
			
		||||
        DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary);
 | 
			
		||||
        // 创建 HikariConfig 配置类
 | 
			
		||||
        HikariConfig hikariConfig = new HikariConfig();
 | 
			
		||||
        hikariConfig.setJdbcUrl(dataSourceProperty.getUrl());
 | 
			
		||||
        hikariConfig.setUsername(dataSourceProperty.getUsername());
 | 
			
		||||
        hikariConfig.setPassword(dataSourceProperty.getPassword());
 | 
			
		||||
        hikariConfig.addDataSourceProperty("useInformationSchema", "true"); // 设置可以获取 tables remarks 信息
 | 
			
		||||
        // 创建数据源
 | 
			
		||||
        return new HikariDataSource(hikariConfig);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建 screw 的引擎配置
 | 
			
		||||
     */
 | 
			
		||||
    private static EngineConfig buildEngineConfig(EngineFileType fileOutputType, String docFileName) {
 | 
			
		||||
        return EngineConfig.builder()
 | 
			
		||||
                .fileOutputDir(FILE_OUTPUT_DIR) // 生成文件路径
 | 
			
		||||
                .openOutputDir(false) // 打开目录
 | 
			
		||||
                .fileType(fileOutputType) // 文件类型
 | 
			
		||||
                .produceType(EngineTemplateType.velocity) // 文件类型
 | 
			
		||||
                .fileName(docFileName) // 自定义文件名称
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建 screw 的处理配置,一般可忽略
 | 
			
		||||
     * 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时,将生成指定表,其余表不生成、并跳过忽略表配置
 | 
			
		||||
     */
 | 
			
		||||
    private static ProcessConfig buildProcessConfig() {
 | 
			
		||||
        return ProcessConfig.builder()
 | 
			
		||||
                .ignoreTablePrefix(Arrays.asList("QRTZ_", "ACT_", "FLW_")) // 忽略表前缀
 | 
			
		||||
                .build();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user