diff --git a/zyplayer-doc-db/pom.xml b/zyplayer-doc-db/pom.xml index b391b966..9a18d26e 100644 --- a/zyplayer-doc-db/pom.xml +++ b/zyplayer-doc-db/pom.xml @@ -1,226 +1,230 @@ - - 4.0.0 - - com.zyplayer - zyplayer-doc-db - 1.0.1 - jar - zyplayer-doc-db - 数据库文档工具 - https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc-db - - - zyplayer - 暮光:城中城 - 806783409@qq.com - - Java Development Engineer - - 2018-05-22 16:06:06 - - - - - org.springframework.boot - spring-boot-starter-parent - 1.4.2.RELEASE - - - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.mybatis - mybatis - 3.4.6 - - - org.mybatis - mybatis-spring - 1.3.0 - - - io.springfox - springfox-swagger2 - 2.7.0 - - - com.alibaba - fastjson - 1.2.44 - - - cn.hutool - hutool-http - 4.1.8 - - - commons-lang - commons-lang - 2.6 - - - - - UTF-8 - UTF-8 - 1.8 - - true - ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} - - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - scm:git@git.oschina.net:zyplayer/zyplayer-doc.git - scm:git@git.oschina.net:zyplayer/zyplayer-doc.git - git@git.oschina.net:zyplayer/zyplayer-doc.git - - - - - snapshots - https://oss.sonatype.org/content/repositories/snapshots/ - - - snapshots - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - - - src/main/resources - META-INF/resources/ - - - src/main/java - - **/* - - - **/*.java - - false - - - src/main/webapp - - **/* - - false - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.2 - - true - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - UTF-8 - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.18.1 - - ${skipTests} - - - - - - - release - - - - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - package - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.10.2 - - true - - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - verify - - sign - - - - - - - - + + 4.0.0 + + com.zyplayer + zyplayer-doc-db + 1.0.1 + jar + zyplayer-doc-db + 数据库文档工具 + https://gitee.com/zyplayer/zyplayer-doc/zyplayer-doc-db + + + zyplayer + 暮光:城中城 + 806783409@qq.com + + Java Development Engineer + + 2018-05-22 16:06:06 + + + + + org.springframework.boot + spring-boot-starter-parent + 1.4.2.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-jta-atomikos + + + org.mybatis + mybatis + 3.4.6 + + + org.mybatis + mybatis-spring + 1.3.0 + + + io.springfox + springfox-swagger2 + 2.7.0 + + + com.alibaba + fastjson + 1.2.44 + + + cn.hutool + hutool-http + 4.1.8 + + + commons-lang + commons-lang + 2.6 + + + + + UTF-8 + UTF-8 + 1.8 + + true + ${project.build.outputDirectory}/META-INF/resources/webjars/${project.artifactId}/${project.version} + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + scm:git@git.oschina.net:zyplayer/zyplayer-doc.git + scm:git@git.oschina.net:zyplayer/zyplayer-doc.git + git@git.oschina.net:zyplayer/zyplayer-doc.git + + + + + snapshots + https://oss.sonatype.org/content/repositories/snapshots/ + + + snapshots + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + src/main/resources + META-INF/resources/ + + + src/main/java + + **/* + + + **/*.java + + false + + + src/main/webapp + + **/* + + false + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.2 + + true + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + ${skipTests} + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + package + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.2 + + true + + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + verify + + sign + + + + + + + + \ No newline at end of file diff --git a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/controller/DatabaseDocController.java b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/controller/DatabaseDocController.java index 4f7d8583..4019d19b 100644 --- a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/controller/DatabaseDocController.java +++ b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/controller/DatabaseDocController.java @@ -1,240 +1,240 @@ -package com.zyplayer.doc.db.controller; - -import java.io.File; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.lang.StringUtils; -import org.mybatis.spring.SqlSessionTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.alibaba.fastjson.JSON; -import com.zyplayer.doc.db.controller.vo.DatabaseExportVo; -import com.zyplayer.doc.db.controller.vo.TableColumnVo; -import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo; -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean; -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; -import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean; -import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto; -import com.zyplayer.doc.db.framework.db.dto.DatabaseInfoDto; -import com.zyplayer.doc.db.framework.db.dto.QueryTableColumnDescDto; -import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto; -import com.zyplayer.doc.db.framework.db.dto.TableDescDto; -import com.zyplayer.doc.db.framework.db.dto.TableInfoDto; -import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper; -import com.zyplayer.doc.db.framework.db.mapper.mysql.MysqlMapper; -import com.zyplayer.doc.db.framework.json.DocDbResponseJson; -import com.zyplayer.doc.db.framework.json.ResponseJson; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ZipUtil; - -/** - * 文档控制器 - * - * @author 暮光:城中城 - * @since 2018年8月8日 - */ -@RestController -@RequestMapping("/zyplayer-doc-db/doc-db") -public class DatabaseDocController { - - @Autowired(required = false) - DatabaseRegistrationBean databaseRegistrationBean; - - @PostMapping(value = "/getDataSourceList") - public ResponseJson getDataSourceList() { - List factoryBeanList = databaseRegistrationBean.getDatabaseFactoryBeanList(); - Set dataSourceList = factoryBeanList.stream().collect(Collectors.mapping(DatabaseFactoryBean::getHost, Collectors.toSet())); - return DocDbResponseJson.ok(dataSourceList); - } - - @PostMapping(value = "/getDatabaseList") - public ResponseJson getDatabaseList(String host) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapperByHost(host); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - List dbNameDtoList = baseMapper.getDatabaseList(); - return DocDbResponseJson.ok(dbNameDtoList); - } - - @PostMapping(value = "/getTableList") - public ResponseJson getTableList(String host, String dbName) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - List dbTableList = baseMapper.getTableList(dbName); - return DocDbResponseJson.ok(dbTableList); - } - - @PostMapping(value = "/getTableColumnList") - public ResponseJson getTableColumnList(String host, String dbName, String tableName) { - DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getDatabaseFactoryBean(host, dbName); - if (databaseFactoryBean == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - TableColumnVo tableColumnVo = this.getTableColumnVo(databaseFactoryBean, dbName, tableName); - return DocDbResponseJson.ok(tableColumnVo); - } - - @PostMapping(value = "/getTableColumnDescList") - public ResponseJson getTableColumnDescList(String host, String dbName, String tableName) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - List columnDescDto = baseMapper.getTableColumnDescList(tableName); - return DocDbResponseJson.ok(columnDescDto); - } - - @PostMapping(value = "/getTableAndColumnBySearch") - public ResponseJson getTableAndColumnBySearch(String host, String dbName, String tableName, String searchText) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - if (StringUtils.isNotBlank(searchText)) { - searchText = "%" + searchText + "%"; - } - List columnDescDto = baseMapper.getTableAndColumnBySearch(dbName, searchText); - return DocDbResponseJson.ok(columnDescDto); - } - - @PostMapping(value = "/getTableDescList") - public ResponseJson getTableDescList(String host, String dbName, String tableName) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - List columnDescDto = baseMapper.getTableDescList(tableName); - return DocDbResponseJson.ok(columnDescDto); - } - - @PostMapping(value = "/updateTableDesc") - public ResponseJson updateTableDesc(String host, String dbName, String tableName, String newDesc) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - baseMapper.updateTableDesc(dbName, tableName, newDesc); - return DocDbResponseJson.ok(); - } - - @PostMapping(value = "/updateTableColumnDesc") - public ResponseJson updateTableColumnDesc(String host, String dbName, String tableName, String columnName, String newDesc) { - BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); - if (baseMapper == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - ColumnInfoDto columnInfo = null; - // mysql要同时修改类型默认值等,所以先查出来 - MysqlMapper mysqlMapper = databaseRegistrationBean.getBaseMapper(host, dbName, MysqlMapper.class); - if (mysqlMapper != null) { - columnInfo = mysqlMapper.getColumnInfo(dbName, tableName, columnName); - String isNullable = Optional.ofNullable(columnInfo.getIsNullable()).orElse(""); - columnInfo.setIsNullable("yes".equalsIgnoreCase(isNullable) ? "null" : "not null"); - String columnDefault = columnInfo.getColumnDefault(); - if (StringUtils.isNotBlank(columnDefault)) { - columnInfo.setColumnDefault("DEFAULT " + columnDefault); - } else { - columnInfo.setColumnDefault(""); - } - String extra = columnInfo.getExtra(); - columnInfo.setExtra(StringUtils.isBlank(extra) ? "" : extra); - } - baseMapper.updateTableColumnDesc(dbName, tableName, columnName, newDesc, columnInfo); - return DocDbResponseJson.ok(); - } - - @GetMapping(value = "/exportDatabase") - public ResponseJson exportDatabase(HttpServletResponse response, String host, String dbName, String tableNames) { - if (StringUtils.isBlank(tableNames)) { - return DocDbResponseJson.warn("请选择需要导出的表"); - } - DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getDatabaseFactoryBean(host, dbName); - if (databaseFactoryBean == null) { - return DocDbResponseJson.warn("未找到对应的数据库连接"); - } - List tableList = new LinkedList<>(); - Map> columnList = new HashMap<>(); - String[] tableNameArr = tableNames.split(","); - for (String tableName : tableNameArr) { - if (StringUtils.isBlank(tableName)) { - continue; - } - TableColumnVo tableColumnVo = this.getTableColumnVo(databaseFactoryBean, dbName, tableName); - columnList.put(tableName, tableColumnVo.getColumnList()); - tableList.add(tableColumnVo.getTableInfo()); - } - DatabaseExportVo exportVo = new DatabaseExportVo(); - exportVo.setColumnList(columnList); - exportVo.setTableList(tableList); - String content = JSON.toJSONString(exportVo); - content = "var database = " + content; - - response.setContentType("application/octet-stream"); - response.addHeader("Content-Disposition", "attachment;filename=database.js"); - response.setCharacterEncoding("utf-8"); - // 将文件输入流写入response的输出流中 - try { - IoUtil.write(response.getOutputStream(), "utf-8", true, content); - } catch (Exception e) { - e.printStackTrace(); - } - return DocDbResponseJson.ok(); - } - - private TableColumnVo getTableColumnVo(DatabaseFactoryBean databaseFactoryBean, String dbName, String tableName) { - SqlSessionTemplate sessionTemplate = databaseFactoryBean.getSqlSessionTemplate(); - BaseMapper baseMapper = sessionTemplate.getMapper(BaseMapper.class); - List columnDescDto = baseMapper.getTableColumnList(dbName, tableName); - // SQLSERVER要单独查字段注释 - if (databaseFactoryBean.getDatabaseProduct() == DatabaseProduct.SQLSERVER) { - List columnDescList = baseMapper.getTableColumnDescList(tableName); - Map columnMap = columnDescDto.stream().collect(Collectors.toMap(TableColumnDescDto::getName, val -> val)); - // 字段注释 - for (TableColumnDescDto descDto : columnDescList) { - TableColumnDescDto tempDesc = columnMap.get(descDto.getName()); - if(tempDesc != null) { - tempDesc.setDescription(descDto.getDescription()); - } - } - } - TableColumnVo tableColumnVo = new TableColumnVo(); - tableColumnVo.setColumnList(columnDescDto); - // 表注释 - TableInfoVo tableInfoVo = new TableInfoVo(); - List tableDescList = baseMapper.getTableDescList(tableName); - String description = null; - if (tableDescList.size() > 0) { - TableDescDto descDto = tableDescList.get(0); - description = descDto.getDescription(); - } - description = Optional.ofNullable(description).orElse(""); - tableInfoVo.setDescription(description); - tableInfoVo.setTableName(tableName); - tableColumnVo.setTableInfo(tableInfoVo); - return tableColumnVo; - } - - public static void main(String[] args) { - //File zipFile = ZipUtil.zip("d:/aaa"); - File zipFile = new File("d:/111.zip"); - ZipUtil.zip(zipFile, true, new File("d:/111.txt"), - new File("d:/222.txt"), new File("d:/aaa")); - } -} - +package com.zyplayer.doc.db.controller; + +import java.io.File; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringUtils; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSON; +import com.zyplayer.doc.db.controller.vo.DatabaseExportVo; +import com.zyplayer.doc.db.controller.vo.TableColumnVo; +import com.zyplayer.doc.db.controller.vo.TableColumnVo.TableInfoVo; +import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean; +import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; +import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean; +import com.zyplayer.doc.db.framework.db.dto.ColumnInfoDto; +import com.zyplayer.doc.db.framework.db.dto.DatabaseInfoDto; +import com.zyplayer.doc.db.framework.db.dto.QueryTableColumnDescDto; +import com.zyplayer.doc.db.framework.db.dto.TableColumnDescDto; +import com.zyplayer.doc.db.framework.db.dto.TableDescDto; +import com.zyplayer.doc.db.framework.db.dto.TableInfoDto; +import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper; +import com.zyplayer.doc.db.framework.db.mapper.mysql.MysqlMapper; +import com.zyplayer.doc.db.framework.json.DocDbResponseJson; +import com.zyplayer.doc.db.framework.json.ResponseJson; + +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ZipUtil; + +/** + * 文档控制器 + * + * @author 暮光:城中城 + * @since 2018年8月8日 + */ +@RestController +@RequestMapping("/zyplayer-doc-db/doc-db") +public class DatabaseDocController { + + @Autowired + DatabaseRegistrationBean databaseRegistrationBean; + + @PostMapping(value = "/getDataSourceList") + public ResponseJson getDataSourceList() { + List factoryBeanList = databaseRegistrationBean.getDatabaseFactoryBeanList(); + Set dataSourceList = factoryBeanList.stream().collect(Collectors.mapping(DatabaseFactoryBean::getHost, Collectors.toSet())); + return DocDbResponseJson.ok(dataSourceList); + } + + @PostMapping(value = "/getDatabaseList") + public ResponseJson getDatabaseList(String host) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapperByHost(host); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + List dbNameDtoList = baseMapper.getDatabaseList(); + return DocDbResponseJson.ok(dbNameDtoList); + } + + @PostMapping(value = "/getTableList") + public ResponseJson getTableList(String host, String dbName) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + List dbTableList = baseMapper.getTableList(dbName); + return DocDbResponseJson.ok(dbTableList); + } + + @PostMapping(value = "/getTableColumnList") + public ResponseJson getTableColumnList(String host, String dbName, String tableName) { + DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getDatabaseFactoryBean(host, dbName); + if (databaseFactoryBean == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + TableColumnVo tableColumnVo = this.getTableColumnVo(databaseFactoryBean, dbName, tableName); + return DocDbResponseJson.ok(tableColumnVo); + } + + @PostMapping(value = "/getTableColumnDescList") + public ResponseJson getTableColumnDescList(String host, String dbName, String tableName) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + List columnDescDto = baseMapper.getTableColumnDescList(tableName); + return DocDbResponseJson.ok(columnDescDto); + } + + @PostMapping(value = "/getTableAndColumnBySearch") + public ResponseJson getTableAndColumnBySearch(String host, String dbName, String tableName, String searchText) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + if (StringUtils.isNotBlank(searchText)) { + searchText = "%" + searchText + "%"; + } + List columnDescDto = baseMapper.getTableAndColumnBySearch(dbName, searchText); + return DocDbResponseJson.ok(columnDescDto); + } + + @PostMapping(value = "/getTableDescList") + public ResponseJson getTableDescList(String host, String dbName, String tableName) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + List columnDescDto = baseMapper.getTableDescList(tableName); + return DocDbResponseJson.ok(columnDescDto); + } + + @PostMapping(value = "/updateTableDesc") + public ResponseJson updateTableDesc(String host, String dbName, String tableName, String newDesc) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + baseMapper.updateTableDesc(dbName, tableName, newDesc); + return DocDbResponseJson.ok(); + } + + @PostMapping(value = "/updateTableColumnDesc") + public ResponseJson updateTableColumnDesc(String host, String dbName, String tableName, String columnName, String newDesc) { + BaseMapper baseMapper = databaseRegistrationBean.getBaseMapper(host, dbName); + if (baseMapper == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + ColumnInfoDto columnInfo = null; + // mysql要同时修改类型默认值等,所以先查出来 + MysqlMapper mysqlMapper = databaseRegistrationBean.getBaseMapper(host, dbName, MysqlMapper.class); + if (mysqlMapper != null) { + columnInfo = mysqlMapper.getColumnInfo(dbName, tableName, columnName); + String isNullable = Optional.ofNullable(columnInfo.getIsNullable()).orElse(""); + columnInfo.setIsNullable("yes".equalsIgnoreCase(isNullable) ? "null" : "not null"); + String columnDefault = columnInfo.getColumnDefault(); + if (StringUtils.isNotBlank(columnDefault)) { + columnInfo.setColumnDefault("DEFAULT " + columnDefault); + } else { + columnInfo.setColumnDefault(""); + } + String extra = columnInfo.getExtra(); + columnInfo.setExtra(StringUtils.isBlank(extra) ? "" : extra); + } + baseMapper.updateTableColumnDesc(dbName, tableName, columnName, newDesc, columnInfo); + return DocDbResponseJson.ok(); + } + + @GetMapping(value = "/exportDatabase") + public ResponseJson exportDatabase(HttpServletResponse response, String host, String dbName, String tableNames) { + if (StringUtils.isBlank(tableNames)) { + return DocDbResponseJson.warn("请选择需要导出的表"); + } + DatabaseFactoryBean databaseFactoryBean = databaseRegistrationBean.getDatabaseFactoryBean(host, dbName); + if (databaseFactoryBean == null) { + return DocDbResponseJson.warn("未找到对应的数据库连接"); + } + List tableList = new LinkedList<>(); + Map> columnList = new HashMap<>(); + String[] tableNameArr = tableNames.split(","); + for (String tableName : tableNameArr) { + if (StringUtils.isBlank(tableName)) { + continue; + } + TableColumnVo tableColumnVo = this.getTableColumnVo(databaseFactoryBean, dbName, tableName); + columnList.put(tableName, tableColumnVo.getColumnList()); + tableList.add(tableColumnVo.getTableInfo()); + } + DatabaseExportVo exportVo = new DatabaseExportVo(); + exportVo.setColumnList(columnList); + exportVo.setTableList(tableList); + String content = JSON.toJSONString(exportVo); + content = "var database = " + content; + + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", "attachment;filename=database.js"); + response.setCharacterEncoding("utf-8"); + // 将文件输入流写入response的输出流中 + try { + IoUtil.write(response.getOutputStream(), "utf-8", true, content); + } catch (Exception e) { + e.printStackTrace(); + } + return DocDbResponseJson.ok(); + } + + private TableColumnVo getTableColumnVo(DatabaseFactoryBean databaseFactoryBean, String dbName, String tableName) { + SqlSessionTemplate sessionTemplate = databaseFactoryBean.getSqlSessionTemplate(); + BaseMapper baseMapper = sessionTemplate.getMapper(BaseMapper.class); + List columnDescDto = baseMapper.getTableColumnList(dbName, tableName); + // SQLSERVER要单独查字段注释 + if (databaseFactoryBean.getDatabaseProduct() == DatabaseProduct.SQLSERVER) { + List columnDescList = baseMapper.getTableColumnDescList(tableName); + Map columnMap = columnDescDto.stream().collect(Collectors.toMap(TableColumnDescDto::getName, val -> val)); + // 字段注释 + for (TableColumnDescDto descDto : columnDescList) { + TableColumnDescDto tempDesc = columnMap.get(descDto.getName()); + if(tempDesc != null) { + tempDesc.setDescription(descDto.getDescription()); + } + } + } + TableColumnVo tableColumnVo = new TableColumnVo(); + tableColumnVo.setColumnList(columnDescDto); + // 表注释 + TableInfoVo tableInfoVo = new TableInfoVo(); + List tableDescList = baseMapper.getTableDescList(tableName); + String description = null; + if (tableDescList.size() > 0) { + TableDescDto descDto = tableDescList.get(0); + description = descDto.getDescription(); + } + description = Optional.ofNullable(description).orElse(""); + tableInfoVo.setDescription(description); + tableInfoVo.setTableName(tableName); + tableColumnVo.setTableInfo(tableInfoVo); + return tableColumnVo; + } + + public static void main(String[] args) { + //File zipFile = ZipUtil.zip("d:/aaa"); + File zipFile = new File("d:/111.zip"); + ZipUtil.zip(zipFile, true, new File("d:/111.txt"), + new File("d:/222.txt"), new File("d:/aaa")); + } +} + diff --git a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/configuration/ApplicationListenerBean.java b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/configuration/ApplicationListenerBean.java index 677d85e5..0b3e7199 100644 --- a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/configuration/ApplicationListenerBean.java +++ b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/configuration/ApplicationListenerBean.java @@ -1,90 +1,115 @@ -package com.zyplayer.doc.db.framework.configuration; - -import java.sql.DatabaseMetaData; -import java.util.LinkedList; -import java.util.List; - -import javax.sql.DataSource; - -import org.mybatis.spring.SqlSessionFactoryBean; -import org.mybatis.spring.SqlSessionTemplate; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.stereotype.Component; - -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean; -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; -import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean; - -@Component -public class ApplicationListenerBean implements ApplicationListener { - - @Autowired(required = false) - DatabaseRegistrationBean databaseRegistrationBean; - - private volatile static boolean IS_INIT = false; - - @Override - public void onApplicationEvent(ContextRefreshedEvent event) { - if (databaseRegistrationBean == null || IS_INIT) { - return; - } - // 会被调用两次 - IS_INIT = true; - List databaseFactoryBeanList = new LinkedList<>(); - for (DataSource dataSource : databaseRegistrationBean.getDataSourceList()) { - try { - DatabaseFactoryBean databaseFactoryBean = new DatabaseFactoryBean(); - DatabaseMetaData metaData = dataSource.getConnection().getMetaData(); - String productName = metaData.getDatabaseProductName().toLowerCase(); - Resource[] resources = null; - String dbUrl = metaData.getURL(); - PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - if (productName.indexOf("mysql") >= 0) { - // jdbc:mysql://192.168.0.1:3306/user_info?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true - String[] urlParamArr = dbUrl.split("\\?"); - String[] urlDbNameArr = urlParamArr[0].split("/"); - if (urlDbNameArr.length >= 2) { - databaseFactoryBean.setDbName(urlDbNameArr[urlDbNameArr.length - 1]); - databaseFactoryBean.setHost(urlDbNameArr[urlDbNameArr.length - 2]); - } - databaseFactoryBean.setDatabaseProduct(DatabaseProduct.MYSQL); - resources = resolver.getResources("classpath:com/zyplayer/doc/db/framework/db/mapper/mysql/*.xml"); - } else if (productName.indexOf("sql server") >= 0) { - // jdbc:jtds:sqlserver://192.168.0.1:33434;socketTimeout=60;DatabaseName=user_info; - String[] urlParamArr = dbUrl.split(";"); - String[] urlDbNameArr = urlParamArr[0].split("/"); - databaseFactoryBean.setHost(urlDbNameArr[urlDbNameArr.length - 1]); - for (String urlParam : urlParamArr) { - String[] keyValArr = urlParam.split("="); - if (keyValArr.length >= 2 && keyValArr[0].equalsIgnoreCase("DatabaseName")) { - databaseFactoryBean.setDbName(keyValArr[1]); - } - } - databaseFactoryBean.setDatabaseProduct(DatabaseProduct.SQLSERVER); - resources = resolver.getResources("classpath:com/zyplayer/doc/db/framework/db/mapper/sqlserver/*.xml"); - } - if (resources == null) { - continue; - } - // 创建sqlSessionTemplate - SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); - sqlSessionFactoryBean.setDataSource(dataSource); - sqlSessionFactoryBean.setMapperLocations(resources); - SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactoryBean.getObject()); - // 组装自定义的bean - databaseFactoryBean.setDataSource(dataSource); - databaseFactoryBean.setSqlSessionTemplate(sqlSessionTemplate); - databaseFactoryBean.setUrl(dbUrl); - databaseFactoryBeanList.add(databaseFactoryBean); - } catch (Exception e) { - e.printStackTrace(); - } - } - databaseRegistrationBean.setDatabaseFactoryBeanList(databaseFactoryBeanList); - } - -} +package com.zyplayer.doc.db.framework.configuration; + +import java.sql.DatabaseMetaData; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.sql.DataSource; + +import com.zyplayer.doc.db.framework.db.bean.DbConfigBean; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; +import org.springframework.context.ApplicationListener; +import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.stereotype.Component; + +import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean; +import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; +import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean; + +@Component +public class ApplicationListenerBean implements ApplicationListener { + + @Autowired + DatabaseRegistrationBean databaseRegistrationBean; + + private volatile static boolean IS_INIT = false; + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + if (databaseRegistrationBean == null || IS_INIT) { + return; + } + // 会被调用两次 + IS_INIT = true; + Integer dataSourceIndex = 0; + List databaseFactoryBeanList = new LinkedList<>(); + for (DbConfigBean dbConfigBean : databaseRegistrationBean.getDbConfigList()) { + try { + // 数据源配置 + Properties xaProperties = new Properties(); + xaProperties.setProperty("driverClassName", dbConfigBean.getDriverClassName()); + xaProperties.setProperty("url", dbConfigBean.getUrl()); + xaProperties.setProperty("username", dbConfigBean.getUsername()); + xaProperties.setProperty("password", dbConfigBean.getPassword()); + xaProperties.setProperty("maxActive", "500"); + xaProperties.setProperty("testOnBorrow", "true"); + xaProperties.setProperty("testWhileIdle", "true"); + xaProperties.setProperty("validationQuery", "select 'x'"); + // 数据源 + AtomikosDataSourceBean dataSource = new AtomikosDataSourceBean(); + dataSource.setXaProperties(xaProperties); + dataSource.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource"); + dataSource.setUniqueResourceName("zyplayer-doc-db" + (dataSourceIndex++)); + dataSource.setMaxPoolSize(500); + dataSource.setMinPoolSize(1); + dataSource.setMaxLifetime(60); + // 描述连接信息的对象 + DatabaseFactoryBean databaseFactoryBean = new DatabaseFactoryBean(); + DatabaseMetaData metaData = dataSource.getConnection().getMetaData(); + String productName = metaData.getDatabaseProductName().toLowerCase(); + Resource[] resources = null; + String dbUrl = metaData.getURL(); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + if (productName.indexOf("mysql") >= 0) { + // jdbc:mysql://192.168.0.1:3306/user_info?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true + String[] urlParamArr = dbUrl.split("\\?"); + String[] urlDbNameArr = urlParamArr[0].split("/"); + if (urlDbNameArr.length >= 2) { + databaseFactoryBean.setDbName(urlDbNameArr[urlDbNameArr.length - 1]); + databaseFactoryBean.setHost(urlDbNameArr[urlDbNameArr.length - 2]); + } + databaseFactoryBean.setDatabaseProduct(DatabaseProduct.MYSQL); + resources = resolver.getResources("classpath:com/zyplayer/doc/db/framework/db/mapper/mysql/*.xml"); + } else if (productName.indexOf("sql server") >= 0) { + // jdbc:jtds:sqlserver://192.168.0.1:33434;socketTimeout=60;DatabaseName=user_info; + String[] urlParamArr = dbUrl.split(";"); + String[] urlDbNameArr = urlParamArr[0].split("/"); + databaseFactoryBean.setHost(urlDbNameArr[urlDbNameArr.length - 1]); + for (String urlParam : urlParamArr) { + String[] keyValArr = urlParam.split("="); + if (keyValArr.length >= 2 && keyValArr[0].equalsIgnoreCase("DatabaseName")) { + databaseFactoryBean.setDbName(keyValArr[1]); + } + } + databaseFactoryBean.setDatabaseProduct(DatabaseProduct.SQLSERVER); + resources = resolver.getResources("classpath:com/zyplayer/doc/db/framework/db/mapper/sqlserver/*.xml"); + } + if (resources == null) { + continue; + } + // 创建sqlSessionTemplate + SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(dataSource); + sqlSessionFactoryBean.setMapperLocations(resources); + SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactoryBean.getObject()); + // 组装自定义的bean + databaseFactoryBean.setDataSource(dataSource); + databaseFactoryBean.setSqlSessionTemplate(sqlSessionTemplate); + databaseFactoryBean.setUrl(dbUrl); + databaseFactoryBeanList.add(databaseFactoryBean); + } catch (Exception e) { + e.printStackTrace(); + } + } + databaseRegistrationBean.setDatabaseFactoryBeanList(databaseFactoryBeanList); + } + +} diff --git a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DatabaseRegistrationBean.java b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DatabaseRegistrationBean.java index 768cab8d..4c68822c 100644 --- a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DatabaseRegistrationBean.java +++ b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DatabaseRegistrationBean.java @@ -1,92 +1,89 @@ -package com.zyplayer.doc.db.framework.db.bean; - -import java.util.LinkedList; -import java.util.List; - -import javax.sql.DataSource; - -import org.apache.commons.lang.StringUtils; -import org.mybatis.spring.SqlSessionTemplate; - -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean; -import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; -import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper; - -/** - * 需要声明注入的对象,只需要设置dataSourceList即可 - * databaseFactoryBeanList是后面生成的 - * - * @author 暮光:城中城 - * @since 2018年8月8日 - */ -public class DatabaseRegistrationBean { - - private List dataSourceList = new LinkedList<>(); - - private List databaseFactoryBeanList = new LinkedList<>(); - - public List getDataSourceList() { - return dataSourceList; - } - - public void setDataSourceList(List dataSourceList) { - this.dataSourceList = dataSourceList; - } - - public List getDatabaseFactoryBeanList() { - return databaseFactoryBeanList; - } - - public void setDatabaseFactoryBeanList(List databaseFactoryBeanList) { - this.databaseFactoryBeanList = databaseFactoryBeanList; - } - - public DatabaseFactoryBean getDatabaseFactoryBean(String host, String dbName) { - if (StringUtils.isBlank(dbName)) { - return null; - } - DatabaseFactoryBean resultBean = null; - for (DatabaseFactoryBean databaseFactoryBean : databaseFactoryBeanList) { - if (host.equalsIgnoreCase(databaseFactoryBean.getHost())) { - if (dbName.equalsIgnoreCase(databaseFactoryBean.getDbName())) { - return databaseFactoryBean; - } - if (databaseFactoryBean.getDatabaseProduct() == DatabaseProduct.MYSQL) { - resultBean = databaseFactoryBean; - } - } - } - return resultBean; - } - - public BaseMapper getBaseMapper(String host, String dbName) { - return getBaseMapper(host, dbName, BaseMapper.class); - } - - public T getBaseMapper(String host, String dbName, Class cls) { - DatabaseFactoryBean factoryBean = getDatabaseFactoryBean(host, dbName); - if (factoryBean != null) { - SqlSessionTemplate sessionTemplate = factoryBean.getSqlSessionTemplate(); - try { - return sessionTemplate.getMapper(cls); - } catch (Exception e) {} - } - return null; - } - - public BaseMapper getBaseMapperByHost(String host) { - if (StringUtils.isBlank(host)) { - return null; - } - for (DatabaseFactoryBean databaseFactoryBean : databaseFactoryBeanList) { - if (host.equalsIgnoreCase(databaseFactoryBean.getHost())) { - try { - SqlSessionTemplate sessionTemplate = databaseFactoryBean.getSqlSessionTemplate(); - return sessionTemplate.getMapper(BaseMapper.class); - } catch (Exception e) {} - } - } - return null; - } - +package com.zyplayer.doc.db.framework.db.bean; + +import com.zyplayer.doc.db.framework.db.bean.DatabaseFactoryBean.DatabaseProduct; +import com.zyplayer.doc.db.framework.db.mapper.base.BaseMapper; +import org.apache.commons.lang.StringUtils; +import org.mybatis.spring.SqlSessionTemplate; + +import java.util.LinkedList; +import java.util.List; + +/** + * 需要声明注入的对象,只需要设置dbConfigList即可 + * databaseFactoryBeanList是后面生成的 + * + * @author 暮光:城中城 + * @since 2018年8月8日 + */ +public class DatabaseRegistrationBean { + + // 注入此对象必须配置的参数 + // 配置的数据源连接、账号密码等信息,通过注入得到 + private List dbConfigList = new LinkedList<>(); + // 描述连接信息的对象列表 + private List databaseFactoryBeanList = new LinkedList<>(); + + public List getDatabaseFactoryBeanList() { + return databaseFactoryBeanList; + } + + public void setDatabaseFactoryBeanList(List databaseFactoryBeanList) { + this.databaseFactoryBeanList = databaseFactoryBeanList; + } + + public DatabaseFactoryBean getDatabaseFactoryBean(String host, String dbName) { + if (StringUtils.isBlank(dbName)) { + return null; + } + DatabaseFactoryBean resultBean = null; + for (DatabaseFactoryBean databaseFactoryBean : databaseFactoryBeanList) { + if (host.equalsIgnoreCase(databaseFactoryBean.getHost())) { + if (dbName.equalsIgnoreCase(databaseFactoryBean.getDbName())) { + return databaseFactoryBean; + } + if (databaseFactoryBean.getDatabaseProduct() == DatabaseProduct.MYSQL) { + resultBean = databaseFactoryBean; + } + } + } + return resultBean; + } + + public BaseMapper getBaseMapper(String host, String dbName) { + return getBaseMapper(host, dbName, BaseMapper.class); + } + + public T getBaseMapper(String host, String dbName, Class cls) { + DatabaseFactoryBean factoryBean = getDatabaseFactoryBean(host, dbName); + if (factoryBean != null) { + SqlSessionTemplate sessionTemplate = factoryBean.getSqlSessionTemplate(); + try { + return sessionTemplate.getMapper(cls); + } catch (Exception e) {} + } + return null; + } + + public BaseMapper getBaseMapperByHost(String host) { + if (StringUtils.isBlank(host)) { + return null; + } + for (DatabaseFactoryBean databaseFactoryBean : databaseFactoryBeanList) { + if (host.equalsIgnoreCase(databaseFactoryBean.getHost())) { + try { + SqlSessionTemplate sessionTemplate = databaseFactoryBean.getSqlSessionTemplate(); + return sessionTemplate.getMapper(BaseMapper.class); + } catch (Exception e) {} + } + } + return null; + } + + public List getDbConfigList() { + return dbConfigList; + } + + public void setDbConfigList(List dbConfigList) { + this.dbConfigList = dbConfigList; + } } \ No newline at end of file diff --git a/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DbConfigBean.java b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DbConfigBean.java new file mode 100644 index 00000000..08a8b5c6 --- /dev/null +++ b/zyplayer-doc-db/src/main/java/com/zyplayer/doc/db/framework/db/bean/DbConfigBean.java @@ -0,0 +1,44 @@ +package com.zyplayer.doc.db.framework.db.bean; + +/** + * @Author + * @Date 2018/11/11 + **/ +public class DbConfigBean { + private String driverClassName; + private String url; + private String username; + private String password; + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/zyplayer-doc-db/src/main/resources/doc-db.html b/zyplayer-doc-db/src/main/resources/doc-db.html index 9c786423..124a217b 100644 --- a/zyplayer-doc-db/src/main/resources/doc-db.html +++ b/zyplayer-doc-db/src/main/resources/doc-db.html @@ -1,162 +1,162 @@ - - - - - - zyplayer-doc-db - - - - - - - -
-
-
- -
-
- -
-
- -
-
- - - -
-
-
-
表名:
-
-
- - -
- -
-
-
- - - - - -
字段名自增类型长度NULL主键注释
-
-
-
- -

- Tips:本关系图不是通过外键生成,所以需要在字段注释最后按规则添加外键关系才能生成图表,支持的格式有:
- 1、T:表,例:XXX(字段注释),T:user_info
- 2、T:表.关联ID,例:XXX(字段注释),T:user_info.id
- 3、T:库.表.关联ID,例:XXX(字段注释),T:order_db.user_info.id
- 实验功能,有更好的建议或展示方式欢迎提交建议! -

-
-
-
- - - - -
- - - - - - - - - - - - - + + + + + + 数据库文档 + + + + + + + +
+
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
表名:
+
+
+ + +
+ +
+
+
+ + + + + +
字段名自增类型长度NULL主键注释
+
+
+
+ +

+ Tips:本关系图不是通过外键生成,所以需要在字段注释最后按规则添加外键关系才能生成图表,支持的格式有:
+ 1、T:表,例:XXX(字段注释),T:user_info
+ 2、T:表.关联ID,例:XXX(字段注释),T:user_info.id
+ 3、T:库.表.关联ID,例:XXX(字段注释),T:order_db.user_info.id
+ 实验功能,有更好的建议或展示方式欢迎提交建议! +

+
+
+
+ + + + +
+ + + + + + + + + + + + + diff --git a/zyplayer-doc-manage/pom.xml b/zyplayer-doc-manage/pom.xml index 11ac0bed..0f53ce15 100644 --- a/zyplayer-doc-manage/pom.xml +++ b/zyplayer-doc-manage/pom.xml @@ -30,6 +30,7 @@ 1.8.7 2.9.2 2.9.2 + 1.0.1 @@ -117,6 +118,12 @@ org.springframework.boot spring-boot-starter-security + + com.zyplayer + zyplayer-doc-db + ${zyplayer.doc.db.version} + compile + diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java index 351878a5..0a649bf1 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/Application.java @@ -40,10 +40,10 @@ public class Application extends SpringBootServletInitializer { "zyplayer-doc-swagger:http://{}document.html\n\t" + "swagger-bootstrap-ui:http://{}doc.html\n\t" + "springfox-swagger-ui:http://{}swagger-ui.html\n\t" + - //"数据库地址:http://{}document.html\n " + + "数据库文档管理地址:http://{}doc-db.html\n\t" + "管理地址:http://{}statics/manage/home.html\n" + "----------------------------------------------------------", - urlCtx, urlCtx, urlCtx, urlCtx + urlCtx, urlCtx, urlCtx, urlCtx, urlCtx ); } } diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocDatabaseRegistrationConfig.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocDatabaseRegistrationConfig.java new file mode 100644 index 00000000..78c5ca73 --- /dev/null +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/DocDatabaseRegistrationConfig.java @@ -0,0 +1,23 @@ +package com.zyplayer.doc.manage.framework.config; + +import com.zyplayer.doc.db.framework.configuration.EnableDocDb; +import com.zyplayer.doc.db.framework.db.bean.DatabaseRegistrationBean; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @Author + * @Date 2018/11/11 + **/ +@EnableDocDb +@Configuration +public class DocDatabaseRegistrationConfig { + + @Bean + @ConfigurationProperties(prefix = "zyplayer.doc.db") + public DatabaseRegistrationBean databaseRegistrationBean(){ + return new DatabaseRegistrationBean(); + } + +} diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/MybatisPlusConfig.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/MybatisPlusConfig.java index 5bf09d43..4677cd4f 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/MybatisPlusConfig.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/config/MybatisPlusConfig.java @@ -1,141 +1,141 @@ -package com.zyplayer.doc.manage.framework.config; - -import com.atomikos.icatch.jta.UserTransactionImp; -import com.atomikos.icatch.jta.UserTransactionManager; -import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; -import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; -import com.zyplayer.doc.manage.repository.support.interceptor.SqlLogInterceptor; -import org.apache.ibatis.plugin.Interceptor; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.annotation.EnableTransactionManagement; -import org.springframework.transaction.jta.JtaTransactionManager; - -import javax.sql.DataSource; -import javax.transaction.TransactionManager; -import javax.transaction.UserTransaction; -import java.util.Properties; - -/** - * mybatis plus数据库配置 - */ -@Configuration -public class MybatisPlusConfig { - - /** - * sql日志 - **/ - private static final SqlLogInterceptor SQL_LOG_INTERCEPTOR; - - static { - SQL_LOG_INTERCEPTOR = new SqlLogInterceptor(); - Properties properties = new Properties(); - SQL_LOG_INTERCEPTOR.setProperties(properties); - } - - /** - * 分布式事务配置 - */ - @Configuration - static class JTATransactionManagerConfig { - - @Bean(name = "userTransaction") - public UserTransaction userTransaction() throws Throwable { - UserTransactionImp userTransactionImp = new UserTransactionImp(); - userTransactionImp.setTransactionTimeout(300); - return userTransactionImp; - } - - @Bean(name = "atomikosTransactionManager") - public TransactionManager atomikosTransactionManager() { - UserTransactionManager userTransactionManager = new UserTransactionManager(); - userTransactionManager.setForceShutdown(true); - return userTransactionManager; - } - - @Bean(name = "transactionManager") - public PlatformTransactionManager transactionManager() throws Throwable { - UserTransaction userTransaction = userTransaction(); - TransactionManager atomikosTransactionManager = atomikosTransactionManager(); - - JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(userTransaction, atomikosTransactionManager); - jtaTransactionManager.setAllowCustomIsolationLevels(true); - jtaTransactionManager.setGlobalRollbackOnParticipationFailure(true); - jtaTransactionManager.setDefaultTimeout(30); - - return jtaTransactionManager; - } - } - - /** - * 数据库配置 - */ - @Configuration - @EnableTransactionManagement - @MapperScan(value = "com.zyplayer.doc.manage.repository.manage.mapper", sqlSessionFactoryRef = "manageSqlSessionFactory") - static class ManageMybatisDbConfig { - - @Value("${zyplayer.datasource.manage.driverClassName}") - private String driverClassName; - @Value("${zyplayer.datasource.manage.url}") - private String url; - @Value("${zyplayer.datasource.manage.username}") - private String username; - @Value("${zyplayer.datasource.manage.password}") - private String password; - - @Bean(name = "manageDatasource") - public DataSource manageDatasource() { - Properties xaProperties = new Properties(); - xaProperties.setProperty("driverClassName", driverClassName); - xaProperties.setProperty("url", url); - xaProperties.setProperty("username", username); - xaProperties.setProperty("password", password); - xaProperties.setProperty("maxActive", "500"); - xaProperties.setProperty("testOnBorrow", "true"); - xaProperties.setProperty("testWhileIdle", "true"); - xaProperties.setProperty("validationQuery", "select 'x'"); - - AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean(); - xaDataSource.setXaProperties(xaProperties); - xaDataSource.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource"); - xaDataSource.setUniqueResourceName("manageDatasource"); - xaDataSource.setMaxPoolSize(500); - xaDataSource.setMinPoolSize(1); - xaDataSource.setMaxLifetime(60); - return xaDataSource; - } - - @Bean(name = "manageSqlSessionFactory") - public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception { - MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); - sqlSessionFactoryBean.setDataSource(manageDatasource()); - sqlSessionFactoryBean.setPlugins(new Interceptor[]{SQL_LOG_INTERCEPTOR}); - - PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); - sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml")); - return sqlSessionFactoryBean; - } - } - - @Bean - public PerformanceInterceptor performanceInterceptor() { - PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); - /* */ - performanceInterceptor.setMaxTime(1000); - /* */ - performanceInterceptor.setFormat(true); - return performanceInterceptor; - } - - @Bean - public PaginationInterceptor paginationInterceptor() { - return new PaginationInterceptor(); - } +package com.zyplayer.doc.manage.framework.config; + +import com.atomikos.icatch.jta.UserTransactionImp; +import com.atomikos.icatch.jta.UserTransactionManager; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; +import com.zyplayer.doc.manage.repository.support.interceptor.SqlLogInterceptor; +import org.apache.ibatis.plugin.Interceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.jta.JtaTransactionManager; + +import javax.sql.DataSource; +import javax.transaction.TransactionManager; +import javax.transaction.UserTransaction; +import java.util.Properties; + +/** + * mybatis plus数据库配置 + */ +@Configuration +public class MybatisPlusConfig { + + /** + * sql日志 + **/ + private static final SqlLogInterceptor SQL_LOG_INTERCEPTOR; + + static { + SQL_LOG_INTERCEPTOR = new SqlLogInterceptor(); + Properties properties = new Properties(); + SQL_LOG_INTERCEPTOR.setProperties(properties); + } + + /** + * 分布式事务配置 + */ + @Configuration + static class JTATransactionManagerConfig { + + @Bean(name = "userTransaction") + public UserTransaction userTransaction() throws Throwable { + UserTransactionImp userTransactionImp = new UserTransactionImp(); + userTransactionImp.setTransactionTimeout(300); + return userTransactionImp; + } + + @Bean(name = "atomikosTransactionManager") + public TransactionManager atomikosTransactionManager() { + UserTransactionManager userTransactionManager = new UserTransactionManager(); + userTransactionManager.setForceShutdown(true); + return userTransactionManager; + } + + @Bean(name = "transactionManager") + public PlatformTransactionManager transactionManager() throws Throwable { + UserTransaction userTransaction = userTransaction(); + TransactionManager atomikosTransactionManager = atomikosTransactionManager(); + + JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(userTransaction, atomikosTransactionManager); + jtaTransactionManager.setAllowCustomIsolationLevels(true); + jtaTransactionManager.setGlobalRollbackOnParticipationFailure(true); + jtaTransactionManager.setDefaultTimeout(30); + + return jtaTransactionManager; + } + } + + /** + * 数据库配置 + */ + @Configuration + @EnableTransactionManagement + @MapperScan(value = "com.zyplayer.doc.manage.repository.manage.mapper", sqlSessionFactoryRef = "manageSqlSessionFactory") + static class ManageMybatisDbConfig { + + @Value("${zyplayer.doc.manage.datasource.driverClassName}") + private String driverClassName; + @Value("${zyplayer.doc.manage.datasource.url}") + private String url; + @Value("${zyplayer.doc.manage.datasource.username}") + private String username; + @Value("${zyplayer.doc.manage.datasource.password}") + private String password; + + @Bean(name = "manageDatasource") + public DataSource manageDatasource() { + Properties xaProperties = new Properties(); + xaProperties.setProperty("driverClassName", driverClassName); + xaProperties.setProperty("url", url); + xaProperties.setProperty("username", username); + xaProperties.setProperty("password", password); + xaProperties.setProperty("maxActive", "500"); + xaProperties.setProperty("testOnBorrow", "true"); + xaProperties.setProperty("testWhileIdle", "true"); + xaProperties.setProperty("validationQuery", "select 'x'"); + + AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean(); + xaDataSource.setXaProperties(xaProperties); + xaDataSource.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource"); + xaDataSource.setUniqueResourceName("manageDatasource"); + xaDataSource.setMaxPoolSize(500); + xaDataSource.setMinPoolSize(1); + xaDataSource.setMaxLifetime(60); + return xaDataSource; + } + + @Bean(name = "manageSqlSessionFactory") + public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception { + MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); + sqlSessionFactoryBean.setDataSource(manageDatasource()); + sqlSessionFactoryBean.setPlugins(new Interceptor[]{SQL_LOG_INTERCEPTOR}); + + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml")); + return sqlSessionFactoryBean; + } + } + + @Bean + public PerformanceInterceptor performanceInterceptor() { + PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor(); + /* */ + performanceInterceptor.setMaxTime(1000); + /* */ + performanceInterceptor.setFormat(true); + return performanceInterceptor; + } + + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } } \ No newline at end of file diff --git a/zyplayer-doc-manage/src/main/resources/application.yml b/zyplayer-doc-manage/src/main/resources/application.yml index a992f5d9..b1a9718e 100644 --- a/zyplayer-doc-manage/src/main/resources/application.yml +++ b/zyplayer-doc-manage/src/main/resources/application.yml @@ -1,72 +1,81 @@ -spring: - application: - name: zyplayer-doc-manage - velocity: - layout-url: common/default.vm - cache: false - suffix: .vm - expose-spring-macro-helpers: true - date-tool-attribute: dateTool - number-tool-attribute: numberTool - contentType: text/html;charset=UTF-8 - resource-loader-path: classpath:/vm/ - default-content-type: text/html - ignore-accept-header: true - charset: UTF-8 - properties: - input: - encoding: UTF-8 - output: - encoding: UTF-8 -# datasource: -# driver-class-name: com.mysql.jdbc.Driver -# url: jdbc:mysql://127.0.0.1:3306/zyplayer-doc-manage?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true -# username: root -# password: root - -server: - port: 8082 - servlet: - context-path: /zyplayer-doc-manage - - - -zyplayer: - datasource: - manage: - driverClassName: com.mysql.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/zyplayer-doc-manage?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false - username: root - password: root - -mybatis-plus: - mapper-locations: classpath:/mapper/**/*Mapper.xml - #实体扫描,多个package用逗号或者分号分隔 - typeAliasesPackage: com.baomidou.springboot.entity - typeEnumsPackage: com.baomidou.springboot.entity.enums - global-config: - # 数据库相关配置 - db-config: - #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; - id-type: id_worker - #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" - field-strategy: not_empty - #驼峰下划线转换 - column-underline: true - #数据库大写下划线转换 - #capital-mode: true - #逻辑删除配置 - logic-delete-value: 0 - logic-not-delete-value: 1 - db-type: mysql - #刷新mapper 调试神器 - refresh: true - # 原生配置 - configuration: - map-underscore-to-camel-case: true - cache-enabled: false - - -#一些测试地址 -#https://gitee.com/GeekPerson/central-platform 项目的文档 +spring: + application: + name: zyplayer-doc-manage + velocity: + layout-url: common/default.vm + cache: false + suffix: .vm + expose-spring-macro-helpers: true + date-tool-attribute: dateTool + number-tool-attribute: numberTool + contentType: text/html;charset=UTF-8 + resource-loader-path: classpath:/vm/ + default-content-type: text/html + ignore-accept-header: true + charset: UTF-8 + properties: + input: + encoding: UTF-8 + output: + encoding: UTF-8 + +server: + port: 8082 + servlet: + context-path: /zyplayer-doc-manage + + +zyplayer: + doc: + # zyplayer-doc-manage管理端的数据库配置 + manage: + datasource: + driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/zyplayer-doc-manage?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false + username: root + password: root + # 数据库文档相关 + # 打开/zyplayer-doc-manage/doc-db.html即可看到这里配置的数据库的文档 + db: + dbConfigList: + - driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/zyplayer-doc-manage?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false + username: root + password: root + # 多个数据源直接这样累加 +# - driverClassName: com.mysql.jdbc.Driver +# url: jdbc:mysql://127.0.0.1:3306/zyplayer-doc-manage?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false +# username: root +# password: root + +mybatis-plus: + mapper-locations: classpath:/mapper/**/*Mapper.xml + #实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: com.baomidou.springboot.entity + typeEnumsPackage: com.baomidou.springboot.entity.enums + global-config: + # 数据库相关配置 + db-config: + #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID"; + id-type: id_worker + #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断" + field-strategy: not_empty + #驼峰下划线转换 + column-underline: true + #数据库大写下划线转换 + #capital-mode: true + #逻辑删除配置 + logic-delete-value: 0 + logic-not-delete-value: 1 + db-type: mysql + #刷新mapper 调试神器 + refresh: true + # 原生配置 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + + +#一些测试地址 +#https://gitee.com/GeekPerson/central-platform 项目的文档 #http://47.99.88.28:9200/swagger-resources \ No newline at end of file diff --git a/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css b/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css index 6a15e1a8..97818d55 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css +++ b/zyplayer-doc-manage/src/main/webapp/statics/lib/mg/css/mg-ui.css @@ -2,7 +2,7 @@ body{width: 100%;height: 100%;margin: 0;padding: 0;} a:focus{outline:none;} ul{list-style: none;list-style-type: none;} .tree li a{white-space: nowrap;} -.tree-menu li > ul{background-color: #f1f1f1;} +.tree-menu li > ul{background-color: #555980;} .tree-menu li li li li a{padding-left: 68px;} .tree-menu li li li li li a{padding-left: 88px;} .tree-menu li li li li li li a{padding-left: 108px;} @@ -11,6 +11,11 @@ ul{list-style: none;list-style-type: none;} .tree-menu li li li li li li li li li a{padding-left: 168px;} .tree-menu li li li li li li li li li li a{padding-left: 188px;} .table td, .table th {vertical-align: middle;} +.tree-menu li > a:active, .tree-menu li > a:focus, .tree-menu li > a:hover{color: #fff;} +.tree-menu li > a{color: #fff;} +.tree-menu > li > a{border-bottom-color: #555980;} +.tree-menu > li.open + li > a{border-bottom-color: #555980;border-top-color: #555980;} +.tree-lines ul > li::after{border-top:0;} /**lable的覆盖样式*/ .label{font-size: 100%;} @@ -32,7 +37,7 @@ label{font-weight: normal;} width: 360px; height:100%; position: fixed; top: 0; bottom: 0; left: 0; } .left-header{ - background: #3280fc;width: 100%; height:60px;line-height:60px; + background: #464a6e;width: 100%; height:60px;line-height:60px; position: absolute; top: 0; bottom: 0; left: 0;text-align: center; } .left-header .logo{ @@ -42,7 +47,7 @@ label{font-weight: normal;} font-size: 24px;float: right;margin: 18px 18px 0 0;color: #fff;cursor: pointer; } .left-container{ - width: 100%;position: absolute;background: #f1f1f1;color: rgba(163, 175, 183, .9); + width: 100%;position: absolute;background: #555980;color: #fff; top: 60px; bottom: 0; left: 0; overflow-y: auto; padding: 10px; } .left-container .projects{border: 0px; border-radius: 0px;} @@ -59,7 +64,14 @@ label{font-weight: normal;} #rightContentMask{background-color: rgba(0, 0, 0, 0);padding: 0;z-index:9999; height: 100%;display: none;position: absolute;top: 0;bottom: 0;left:0;right: 0;} #rightZpages{height: 100%;position: relative;top: 0;bottom: 0;left:0;right: 0;} -#rightZpages .tabs-container .tab-pane{padding: 10px;} +/*#rightZpages .tabs-container .tab-pane{padding: 10px;}*/ + +#showLeftContent{ + position: fixed;top: 250px; left: 0px;padding-top: 10px; + width: 15px;height: 35px;z-index: 9999;cursor: pointer; + background-color: #ccc;border-radius: 0 5px 5px 0;display: none; +} +#showLeftContent:hover{color: #fff;} /* S-JSON展示的样式 */ pre.json{margin-top:0px;margin-bottom:0px;} diff --git a/zyplayer-doc-manage/src/main/webapp/statics/manage/about.html b/zyplayer-doc-manage/src/main/webapp/statics/manage/about.html index 6c520a7d..bc23b33e 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/manage/about.html +++ b/zyplayer-doc-manage/src/main/webapp/statics/manage/about.html @@ -9,7 +9,7 @@
- 这是一个关于页面 + 这是一个关于页面,更多内容敬请关注: zyplayer-doc-manage
@@ -23,7 +23,7 @@ diff --git a/zyplayer-doc-manage/src/main/webapp/statics/manage/auth/manage.html b/zyplayer-doc-manage/src/main/webapp/statics/manage/auth/manage.html index 25cbcf82..f6e8e39e 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/manage/auth/manage.html +++ b/zyplayer-doc-manage/src/main/webapp/statics/manage/auth/manage.html @@ -56,7 +56,7 @@ diff --git a/zyplayer-doc-manage/src/main/webapp/statics/manage/home.html b/zyplayer-doc-manage/src/main/webapp/statics/manage/home.html index a2692d26..c67fead9 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/manage/home.html +++ b/zyplayer-doc-manage/src/main/webapp/statics/manage/home.html @@ -3,7 +3,7 @@ - 文档管理系统 - zyplayer + 文档管理系统 @@ -11,6 +11,9 @@ +
+ +
@@ -18,12 +21,30 @@
-
    -
  • + @@ -78,11 +99,26 @@ $("#rightContentMask").hide(); } }); - + /** + * 切换导航栏的隐藏或显示 + */ + $("#changeContentWidth").click(function(){ + $("#leftContent").hide(); + $("#showLeftContent").show(); + changeContentWidth(0); + }); + /** + * 切换导航栏的隐藏或显示 + */ + $("#showLeftContent").click(function(){ + $("#leftContent").show(); + $("#showLeftContent").hide(); + changeContentWidth(360); + }); /** * 页面导航切换 */ - $("#tabZpagesNavigationLi").on("click", ".page-nav", function(){ + $("#tabZpagesNavigationUl").on("click", ".page-nav", function(){ var id = $(this).data("id"); var href = $(this).data("href"); var icon = $(this).data("icon"); diff --git a/zyplayer-doc-manage/src/main/webapp/statics/manage/user/manage.html b/zyplayer-doc-manage/src/main/webapp/statics/manage/user/manage.html index 517ef548..075658d6 100644 --- a/zyplayer-doc-manage/src/main/webapp/statics/manage/user/manage.html +++ b/zyplayer-doc-manage/src/main/webapp/statics/manage/user/manage.html @@ -221,6 +221,7 @@