diff --git a/.gitignore b/.gitignore index 49314b47..11cb7617 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,10 @@ rebel.xml # 忽略office文件打开临时文件 # [~$]*.* tmlog.lck +/.metadata/ +zyplayer-doc-data/bin +zyplayer-doc-api/bin +zyplayer-doc-core/bin +zyplayer-doc-data/src/main/java/com/zyplayer/.metadata/ +zyplayer-doc-db/bin/ +zyplayer-doc-wiki/bin/ \ No newline at end of file diff --git a/build.bat b/build.bat index f87a658f..2f3f94e8 100644 --- a/build.bat +++ b/build.bat @@ -20,6 +20,7 @@ md %target_dir% copy zyplayer-doc-manage\target\zyplayer-doc.jar %target_dir% copy zyplayer-doc-manage\src\main\resources\application.yml %target_dir% +copy zyplayer-doc-manage\src\main\resources\application_pg.yml %target_dir% xcopy /e /y /q zyplayer-doc-other\script %target_dir% diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/MybatisPlusConfig.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/MybatisPlusConfig.java index cb9fc672..efd6d50f 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/MybatisPlusConfig.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/config/MybatisPlusConfig.java @@ -11,7 +11,10 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.apache.ibatis.mapping.DatabaseIdProvider; +import org.apache.ibatis.mapping.VendorDatabaseIdProvider; +import java.util.Properties; import javax.annotation.Resource; import javax.sql.DataSource; @@ -51,9 +54,21 @@ public class MybatisPlusConfig { @Bean(name = "manageSqlSessionFactory") public MybatisSqlSessionFactoryBean manageSqlSessionFactory() throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); + DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider(); + Properties properties = new Properties(); + properties.setProperty("SQL Server", "sqlserver"); + properties.setProperty("DB2", "db2"); + properties.setProperty("Oracle", "oracle"); + properties.setProperty("MySQL", "mysql"); + properties.setProperty("PostgreSQL", "postgresql"); + properties.setProperty("Derby", "derby"); + properties.setProperty("HSQL", "hsqldb"); + properties.setProperty("H2", "h2"); + databaseIdProvider.setProperties(properties); + sqlSessionFactoryBean.setDatabaseIdProvider(databaseIdProvider); sqlSessionFactoryBean.setDataSource(manageDatasource()); sqlSessionFactoryBean.setPlugins(new SqlLogInterceptor(), paginationInterceptor); - + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mapper/manage/*Mapper.xml")); return sqlSessionFactoryBean; diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/mapper/UserInfoMapper.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/mapper/UserInfoMapper.java index 3b01b6da..c3a88ab8 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/mapper/UserInfoMapper.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/repository/manage/mapper/UserInfoMapper.java @@ -18,15 +18,18 @@ import java.util.Map; */ public interface UserInfoMapper extends BaseMapper { - @Select("show tables") + @Select(value = "show tables") + @Select(value = "SELECT table_name FROM information_schema.tables where table_schema = 'zyplayer_doc'", databaseId="postgresql") List getTableList(); @Select("${sql}") List executeSql(@Param("sql") String sql); @Select("SHOW COLUMNS FROM ${tableName}") + @Select(value = "SELECT * FROM information_schema.columns WHERE table_name = #{tableName} and table_schema = 'zyplayer_doc'", databaseId="postgresql") List> getTableColumnList(@Param("tableName") String tableName); @Select("SHOW INDEX FROM ${tableName}") + @Select(value = "SELECT * FROM pg_catalog.pg_indexes WHERE tablename = #{tableName} and schemaname = 'zyplayer_doc'", databaseId="postgresql") List> getTableIndexList(@Param("tableName") String tableName); } diff --git a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/UserAuthServiceImpl.java b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/UserAuthServiceImpl.java index d665213d..6407372b 100644 --- a/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/UserAuthServiceImpl.java +++ b/zyplayer-doc-data/src/main/java/com/zyplayer/doc/data/service/manage/impl/UserAuthServiceImpl.java @@ -32,7 +32,7 @@ public class UserAuthServiceImpl extends ServiceImpl i @Override public List getUserAuthSet(Long userId) { QueryWrapper authWrapper = new QueryWrapper<>(); - authWrapper.eq("user_id", userId).eq("del_flag", "0"); + authWrapper.eq("user_id", userId).eq("del_flag", 0); List userAuthList = this.list(authWrapper); if (CollectionUtils.isEmpty(userAuthList)) { return Collections.emptyList(); diff --git a/zyplayer-doc-data/src/main/resources/mapper/manage/WikiPageMapper.xml b/zyplayer-doc-data/src/main/resources/mapper/manage/WikiPageMapper.xml index d7264987..8f1a014e 100644 --- a/zyplayer-doc-data/src/main/resources/mapper/manage/WikiPageMapper.xml +++ b/zyplayer-doc-data/src/main/resources/mapper/manage/WikiPageMapper.xml @@ -12,4 +12,12 @@ set seq_no = b.rownum where a.parent_id = #{parentId} and a.space_id = #{spaceId}; + + WITH exceeded_wiki_page AS ( + select row_number() over() as rownum, * from wiki_page where parent_id = #{parentId} and space_id = #{spaceId} ORDER BY seq_no ASC, update_time DESC + ) + UPDATE wiki_page SET seq_no = ewp.rownum + FROM exceeded_wiki_page AS ewp + WHERE wiki_page.id = ewp.id + diff --git a/zyplayer-doc-manage/pom.xml b/zyplayer-doc-manage/pom.xml index 86cb3dbc..1378784d 100644 --- a/zyplayer-doc-manage/pom.xml +++ b/zyplayer-doc-manage/pom.xml @@ -57,6 +57,13 @@ mysql mysql-connector-java + + + org.postgresql + postgresql + 42.7.4 + + diff --git a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/upgrade/UpgradeSystemDdlTask.java b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/upgrade/UpgradeSystemDdlTask.java index fa6f36b2..8699ed4c 100644 --- a/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/upgrade/UpgradeSystemDdlTask.java +++ b/zyplayer-doc-manage/src/main/java/com/zyplayer/doc/manage/framework/upgrade/UpgradeSystemDdlTask.java @@ -3,6 +3,9 @@ package com.zyplayer.doc.manage.framework.upgrade; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSessionFactory; +import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import com.zyplayer.doc.core.enums.SystemConfigEnum; import com.zyplayer.doc.core.util.UpgradeInfo; import com.zyplayer.doc.core.util.ZyplayerDocVersion; @@ -37,6 +40,8 @@ public class UpgradeSystemDdlTask { @Resource UserInfoMapper userInfoMapper; @Resource + MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean; + @Resource SystemConfigService systemConfigService; /** @@ -48,6 +53,11 @@ public class UpgradeSystemDdlTask { @PostConstruct public void init() { try { + + SqlSessionFactory sqlSessionFactory = mybatisSqlSessionFactoryBean.getObject(); + Configuration c = sqlSessionFactory.getConfiguration(); + String databaseId = c.getDatabaseId(); + String nowVersion = systemConfigService.getConfigValue(SystemConfigEnum.DOC_SYSTEM_VERSION); if (Objects.equals(nowVersion, ZyplayerDocVersion.version)) { logger.info("当前数据库DDL已是最新版本:" + nowVersion); @@ -57,14 +67,14 @@ public class UpgradeSystemDdlTask { if (StringUtils.isBlank(nowVersion)) { if (CollectionUtils.isEmpty(tableList)) { // 新部署,执行全量建表语句 - initDatabase(); + initDatabase(databaseId); } else { // 执行一次最新的脚本 - upgradeByStart(); + upgradeByStart(databaseId); } } else { // 依次执行高于此版本的脚本 - upgradeByNowVersion(nowVersion, tableList); + upgradeByNowVersion(databaseId, nowVersion, tableList); } // 更新当前版本 systemConfigService.setConfigValue(SystemConfigEnum.DOC_SYSTEM_VERSION, ZyplayerDocVersion.version); @@ -79,8 +89,11 @@ public class UpgradeSystemDdlTask { * @author 暮光:城中城 * @since 2022-12-03 */ - public void initDatabase() { + public void initDatabase(String databaseId) { String sql = loadDDLFile("sql/full/full.sql"); + if (!"mysql".equals(databaseId)) { + sql = loadDDLFile("sql/full/"+databaseId+"_full.sql"); + } if (StringUtils.isBlank(sql)) { logger.error("初始化数据库DDL失败,未找到当前版本的DDL脚本"); return; @@ -90,6 +103,7 @@ public class UpgradeSystemDdlTask { for (SQLStatement sqlStatement : sqlStatements) { // 执行SQL try { + logger.info("开始执行 DDL:" + sqlStatement.toString()); userInfoMapper.executeSql(sqlStatement.toString()); } catch (Exception e) { logger.info("执行升级SQL异常:" + e.getMessage()); @@ -104,7 +118,7 @@ public class UpgradeSystemDdlTask { * @author 暮光:城中城 * @since 2022-12-03 */ - public void upgradeByNowVersion(String nowVersion, List tableList) { + public void upgradeByNowVersion(String databaseId, String nowVersion, List tableList) throws Exception { logger.info("升级数据库DDL脚本:{} --> {}", nowVersion, ZyplayerDocVersion.version); boolean isStart = false; for (int i = ZyplayerDocVersion.versionUpgrade.size() - 1; i >= 0; i--) { @@ -116,7 +130,7 @@ public class UpgradeSystemDdlTask { } else if (!upgradeInfo.isHaveUpgradeSql()) { logger.info("该版本无DDL脚本,跳过此版本:" + upgradeInfo.getVersion()); } else { - upgradeByVersion(upgradeInfo.getVersion(), tableList); + upgradeByVersion(databaseId, upgradeInfo.getVersion(), tableList); } } } @@ -127,9 +141,13 @@ public class UpgradeSystemDdlTask { * @author 暮光:城中城 * @since 2022-12-03 */ - public void upgradeByVersion(String version, List tableList) { + public void upgradeByVersion(String databaseId, String version, List tableList) { logger.info("升级数据库DDL开始:" + version); String sql = loadDDLFile("sql/upgrade/" + version + ".sql"); + if (!"mysql".equals(databaseId)) { + sql = loadDDLFile("sql/upgrade/"+databaseId+"/" + version + ".sql"); + } + if (StringUtils.isBlank(sql)) { logger.info("未找到当前版本的DDL脚本:" + version); return; @@ -156,7 +174,7 @@ public class UpgradeSystemDdlTask { * @author 暮光:城中城 * @since 2022-12-03 */ - public void upgradeByStart() { + public void upgradeByStart(String databaseId) { logger.info("初始升级数据库DDL脚本:{} --> {}", "1.1.1", ZyplayerDocVersion.version); for (int i = ZyplayerDocVersion.versionUpgrade.size() - 1; i >= 0; i--) { UpgradeInfo upgradeInfo = ZyplayerDocVersion.versionUpgrade.get(i); @@ -165,6 +183,9 @@ public class UpgradeSystemDdlTask { continue; } String sql = loadDDLFile("sql/upgrade/" + upgradeInfo.getVersion() + ".sql"); + if (!"mysql".equals(databaseId)) { + sql = loadDDLFile("sql/upgrade/"+databaseId+"/" + upgradeInfo.getVersion() + ".sql"); + } if (StringUtils.isBlank(sql)) { return; } diff --git a/zyplayer-doc-manage/src/main/resources/application_pg.yml b/zyplayer-doc-manage/src/main/resources/application_pg.yml new file mode 100644 index 00000000..c19813ee --- /dev/null +++ b/zyplayer-doc-manage/src/main/resources/application_pg.yml @@ -0,0 +1,60 @@ +# 端口和根路径,jar启动时依此处配置,放tomcat后以tomcat的配置为准 +server: + port: ${SERVER_PORT:8083} + servlet: + context-path: ${CONTEXT_PATH:/} + compression: + enabled: true + min-response-size: 2048 + tomcat: + # tomcat容器层最大传输限制,不做限制 + max-http-post-size: -1 + max-http-form-post-size: -1 + max-swallow-size: -1 + +# 整个文档项目的配置 +zyplayer: + doc: + # ------zyplayer_doc_manage相关配置------ + manage: + # 管理端的数据库配置 + datasource: + driverClassName: ${DATASOURCE_DRIVER:org.postgresql.Driver} + url: jdbc:postgresql://${DATASOURCE_HOST_PORT:127.0.0.1:5432}/${DATASOURCE_DATABASE:zyplayer_doc}?ssl=false&characterEncoding=utf-8¤tSchema=zyplayer_doc + username: ${DATASOURCE_USER:rootxxx} + password: ${DATASOURCE_PASSWORD:passwordxxxx} + enable: + #wiki模块的是否加载,没有此配置也为true,只有填写false才是不加载 + wiki: ${ZYPLAYER_ENABLE_WIKI:true} + #db模块的是否加载,没有此配置也为true,只有填写false才是不加载 + db: ${ZYPLAYER_ENABLE_DB:true} + #api模块的是否加载,没有此配置也为true,只有填写false才是不加载 + api: ${ZYPLAYER_ENABLE_API:true} + # 版本和升级信息获取地址 + upgradePropertiesUrl: https://gitee.com/zyplayer/zyplayer-doc/raw/master/upgrade.properties + # 系统根域名,调试UI时需要使用,同时需要在host文件里配置:127.0.0.1 local.zyplayer.com + originDomainRegex: .*\.zyplayer\.com(:\d+|)$ + # ------WIKI文档相关------ + wiki: + # WIKI文档的文件上传后的存储目录 + upload-path: ${WIKI_UPLOAD_PATH:D:/zyplayerDoc/wikiFiles} + # 是否检查目录有被系统定期清理的风险,建议开启 + upload-path-check: true + # ------数据库相关配置------ + db: + # 最大允许导出的行数,设置的过大有可能会导致内存溢出 + download-max-row: 100000 + swagger: + proxy-request: + # 允许代理请求的域名,正则表达式,多个使用 ; 分割,必须设置,防止通过代理接口访问到内部资源,实在觉得没必要可设置为:.+ + white-domain: .+ + +spring: + application: + name: zyplayer-doc + servlet: + multipart: + max-file-size: ${SERVLET_MAX_FILE_SIZE:100MB} + max-request-size: ${SERVLET_MAX_REQUEST_SIZE:100MB} + datasource: + continue-on-error: true diff --git a/zyplayer-doc-manage/src/main/resources/sql/full/pg_full.sql b/zyplayer-doc-manage/src/main/resources/sql/full/postgresql_full.sql similarity index 99% rename from zyplayer-doc-manage/src/main/resources/sql/full/pg_full.sql rename to zyplayer-doc-manage/src/main/resources/sql/full/postgresql_full.sql index 55c26fa4..9e4e1804 100644 --- a/zyplayer-doc-manage/src/main/resources/sql/full/pg_full.sql +++ b/zyplayer-doc-manage/src/main/resources/sql/full/postgresql_full.sql @@ -1,5 +1,3 @@ - -- add new schema named "zyplayer_doc": - CREATE SCHEMA "zyplayer_doc"; -- create "api_custom_node" table: CREATE TABLE "zyplayer_doc"."api_custom_node" ( "id" serial NOT NULL,