增加数据库文档的 html、word、markdown 的导出

This commit is contained in:
YunaiV 2021-03-14 00:58:39 +08:00
parent 84ca9222c8
commit 2fcb54b576
5 changed files with 81 additions and 20 deletions

View File

@ -8,3 +8,19 @@ export function exportHtml() {
responseType: 'blob' responseType: 'blob'
}) })
} }
export function exportWord() {
return request({
url: '/infra/db-doc/export-word',
method: 'get',
responseType: 'blob'
})
}
export function exportMarkdown() {
return request({
url: '/infra/db-doc/export-markdown',
method: 'get',
responseType: 'blob'
})
}

View File

@ -25,7 +25,10 @@ import {
download, download,
handleTree, handleTree,
downloadExcel, downloadExcel,
downloadZip downloadWord,
downloadZip,
downloadHtml,
downloadMarkdown,
} from "@/utils/ruoyi"; } from "@/utils/ruoyi";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
// 自定义表格工具扩展 // 自定义表格工具扩展
@ -48,6 +51,9 @@ Vue.prototype.getDictDataLabel = getDictDataLabel
Vue.prototype.DICT_TYPE = DICT_TYPE Vue.prototype.DICT_TYPE = DICT_TYPE
Vue.prototype.download = download Vue.prototype.download = download
Vue.prototype.downloadExcel = downloadExcel Vue.prototype.downloadExcel = downloadExcel
Vue.prototype.downloadWord = downloadWord
Vue.prototype.downloadHtml = downloadHtml
Vue.prototype.downloadMarkdown = downloadMarkdown
Vue.prototype.downloadZip = downloadZip Vue.prototype.downloadZip = downloadZip
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree

View File

@ -120,11 +120,26 @@ export function downloadExcel(data, fileName) {
download0(data, fileName, 'application/vnd.ms-excel'); download0(data, fileName, 'application/vnd.ms-excel');
} }
// 下载 Word 方法
export function downloadWord(data, fileName) {
download0(data, fileName, 'application/msword');
}
// 下载 Zip 方法 // 下载 Zip 方法
export function downloadZip(data, fileName) { export function downloadZip(data, fileName) {
download0(data, fileName, 'application/zip'); download0(data, fileName, 'application/zip');
} }
// 下载 Html 方法
export function downloadHtml(data, fileName) {
download0(data, fileName, 'text/html');
}
// 下载 Markdown 方法
export function downloadMarkdown(data, fileName) {
download0(data, fileName, 'text/markdown');
}
function download0(data, fileName, mineType) { function download0(data, fileName, mineType) {
// 创建 blob // 创建 blob
let blob = new Blob([data], {type: mineType}); let blob = new Blob([data], {type: mineType});

View File

@ -1,10 +1,21 @@
<template> <template>
<div v-loading="loading" :style="'height:'+ height"> <div class="app-container">
<iframe :src="src" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" /> <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleExportHtml">导出 HTML</el-button>
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleExportWord">导出 Word</el-button>
<el-button type="primary" icon="el-icon-plus" size="mini" @click="handleExportMarkdown">导出 Markdown</el-button>
</el-col>
</el-row>
<!-- 展示文档 -->
<div v-loading="loading" :style="'height:'+ height">
<iframe :src="src" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
</div>
</div> </div>
</template> </template>
<script> <script>
import {exportHtml} from "@/api/infra/dbDoc"; import { exportHtml, exportWord, exportMarkdown} from "@/api/infra/dbDoc";
export default { export default {
name: "DBDoc", name: "DBDoc",
@ -25,10 +36,31 @@ export default {
}; };
}, },
created() { created() {
// Html
exportHtml().then(response => { exportHtml().then(response => {
// var blob = new Blob(['<a id="a"><b id="b">hey!</b></a>'], {type : 'text/html'}); let blob = new Blob([response], {type : 'text/html'});
this.src = window.URL.createObjectURL(response); this.src = window.URL.createObjectURL(blob);
}) })
}, },
methods: {
/** 处理导出 HTML */
handleExportHtml() {
exportHtml().then(response => {
this.downloadHtml(response, '数据库文档.html');
})
},
/** 处理导出 Word */
handleExportWord() {
exportWord().then(response => {
this.downloadWord(response, '数据库文档.doc');
})
},
/** 处理导出 Markdown */
handleExportMarkdown() {
exportMarkdown().then(response => {
this.downloadMarkdown(response, '数据库文档.md');
})
}
}
}; };
</script> </script>

View File

@ -1,10 +1,7 @@
package cn.iocoder.dashboard.modules.infra.controller.doc; package cn.iocoder.dashboard.modules.infra.controller.doc;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.iocoder.dashboard.util.servlet.ServletUtils; import cn.iocoder.dashboard.util.servlet.ServletUtils;
import cn.smallbun.screw.core.Configuration; import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig; import cn.smallbun.screw.core.engine.EngineConfig;
@ -16,11 +13,8 @@ import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.http.MediaType;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
@ -28,7 +22,8 @@ import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.*; import java.io.File;
import java.io.IOException;
import java.util.Collections; import java.util.Collections;
@Api(tags = "数据库文档") @Api(tags = "数据库文档")
@ -45,9 +40,8 @@ public class InfDbDocController {
private static final String DOC_VERSION = "1.0.0"; private static final String DOC_VERSION = "1.0.0";
private static final String DOC_DESCRIPTION = "文档描述"; private static final String DOC_DESCRIPTION = "文档描述";
@GetMapping("/export-html") @GetMapping("/export-html")
@ApiOperation("导出html格式的数据文档") @ApiOperation("导出 html 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile, public void exportHtml(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
@ -55,7 +49,7 @@ public class InfDbDocController {
} }
@GetMapping("/export-word") @GetMapping("/export-word")
@ApiOperation("导出word格式的数据文档") @ApiOperation("导出 word 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile, public void exportWord(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
@ -63,7 +57,7 @@ public class InfDbDocController {
} }
@GetMapping("/export-markdown") @GetMapping("/export-markdown")
@ApiOperation("导出markdown格式的数据文档") @ApiOperation("导出 markdown 格式的数据文档")
@ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class) @ApiImplicitParam(name = "deleteFile", value = "是否删除在服务器本地生成的数据库文档", example = "true", dataTypeClass = Boolean.class)
public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile, public void exportMarkdown(@RequestParam(defaultValue = "true") Boolean deleteFile,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
@ -77,9 +71,8 @@ public class InfDbDocController {
String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名 String downloadFileName = DOC_FILE_NAME + fileOutputType.getFileSuffix(); //下载后的文件名
try { try {
// 读取返回 // 读取返回
//这里不用hutool工具类它的中文文件名编码有问题,导致在浏览器下载时有问题
ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath)); ServletUtils.writeAttachment(response, downloadFileName, FileUtil.readBytes(filePath));
}finally { } finally {
handleDeleteFile(deleteFile, filePath); handleDeleteFile(deleteFile, filePath);
} }
} }
@ -123,7 +116,6 @@ public class InfDbDocController {
private HikariDataSource buildDataSource() { private HikariDataSource buildDataSource() {
// 创建 HikariConfig 配置类 // 创建 HikariConfig 配置类
HikariConfig hikariConfig = new HikariConfig(); HikariConfig hikariConfig = new HikariConfig();
// hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikariConfig.setJdbcUrl(dataSourceProperties.getUrl()); hikariConfig.setJdbcUrl(dataSourceProperties.getUrl());
hikariConfig.setUsername(dataSourceProperties.getUsername()); hikariConfig.setUsername(dataSourceProperties.getUsername());
hikariConfig.setPassword(dataSourceProperties.getPassword()); hikariConfig.setPassword(dataSourceProperties.getPassword());