version for 1.6.8

This commit is contained in:
inrgihc
2022-04-16 22:14:13 +08:00
parent 9d04f16272
commit 748204bf40
51 changed files with 210 additions and 121 deletions

View File

@@ -38,7 +38,7 @@
- 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为Kingbase8的迁移(**支持绝大多数常规类型字段...**) - 源端oracle/SqlServer/MySQL/MariaDB/PostgreSQL/DB2/DM/Kingbase8/HighGo/Hive向目的端为Kingbase8的迁移(**支持绝大多数常规类型字段...**)
** 注:** 目前Hive只支持账号密码方式认证。 ** 注:** 目前Hive只支持Hive version 3.x的账号密码方式认证。
### 4、结构设计 ### 4、结构设计
@@ -72,7 +72,7 @@
- 环境要求: - 环境要求:
**JDK**:>=1.8 **JDK**:>=1.8 建议用JDK 1.8
**maven**:>=3.6 **maven**:>=3.6
> Maven 仓库默认在国外, 国内使用难免很慢,可以更换为阿里云的仓库。 参考教程: [配置阿里云的仓库教程](https://www.runoob.com/maven/maven-repositories.html) > Maven 仓库默认在国外, 国内使用难免很慢,可以更换为阿里云的仓库。 参考教程: [配置阿里云的仓库教程](https://www.runoob.com/maven/maven-repositories.html)
@@ -101,7 +101,7 @@ cd dbswitch/
sh ./docker-maven-build.sh sh ./docker-maven-build.sh
``` ```
**特别注意:** 在Java9及以上版本默认情况下不允许应用程序查看来自JDK的所有类但在dbswitch中利用反射计算对象的字节大小所以需要在JVM启动时(bin/datasync.sh脚本)需要增加如下参数: **特别注意:** 在Java9及以上版本默认情况下不允许应用程序查看来自JDK的所有类但在dbswitch中利用反射计算对象的字节大小所以需要在JVM启动时需要增加如下参数
``` ```
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
``` ```
@@ -110,15 +110,15 @@ sh ./docker-maven-build.sh
(1) 当编译打包命令执行完成后会在dbswitch/target/目录下生成dbswitch-relase-x.x.x.tar.gz的打包文件将文件拷贝到已安装JRE的部署机器上解压即可。 (1) 当编译打包命令执行完成后会在dbswitch/target/目录下生成dbswitch-relase-x.x.x.tar.gz的打包文件将文件拷贝到已安装JRE的部署机器上解压即可。
(2) 基于docker-compose提供linux联网环境下的**一键安装** (2) 基于docker-compose提供linux联网环境下的**一键安装**,安装命令见 [发行版链接地址](https://gitee.com/inrgihc/dbswitch/releases)
详见文档: [build-docker/install/README.md](build-docker/install) 详见文档: [build-docker/install/README.md](build-docker/install)
## 三、工具使用 ## 三、工具使用
> dbswitch工具提供基于```conf/config.yml```配置的启动方式和基于```conf/application.yml```的WEB端使用方式 > dbswitch工具提供基于```conf/config.yml```配置的dbswitch-data模块启动方式和基于```conf/application.yml```的dbswitch-admin模块的WEB端使用方式
### 1、基于conf/config.yml配置启动命令操作方式 ### 1、基于conf/config.yml配置的dbswitch-data模块启动命令操作方式
#### (1)、配置文件 #### (1)、配置文件
@@ -319,7 +319,7 @@ dbswitch.target.writer-engine-insert=true
> 注如果待同步的两端表结构已经一致或源端字段是目的端字段的子集也可直接用步骤B配置进行变更同步 > 注如果待同步的两端表结构已经一致或源端字段是目的端字段的子集也可直接用步骤B配置进行变更同步
### 2、基于conf/application.yml配置启动的WEB使用方式 ### 2、基于conf/application.yml配置的dbswitch-admin模块启动的WEB使用方式
#### (1)、准备一个MySQL(建议为:版本为 5.7+ )的数据库 #### (1)、准备一个MySQL(建议为:版本为 5.7+ )的数据库
@@ -386,7 +386,7 @@ bin/startup.sh
- dbswitch-admin服务启动时会基于flyway自动建库建表需要保证配置的mysql连接账号具有建库建表等权限 - dbswitch-admin服务启动时会基于flyway自动建库建表需要保证配置的mysql连接账号具有建库建表等权限
- dbswitch离线同步工具提供各种数据库间表结构转换RESTful类型的在线API接口如下:(详见[接口文档](/INTERFACE.md) - dbswitch离线同步工具提供各种数据库间表结构转换RESTful在线API接口如下:(详见[接口文档](/INTERFACE.md)
> Swagger在线接口地址 http://127.0.0.1:9088/swagger-ui/ > Swagger在线接口地址 http://127.0.0.1:9088/swagger-ui/
@@ -419,7 +419,7 @@ bin/startup.sh
### 3、两种方式的适用场景 ### 3、两种方式的适用场景
- 方式一基于conf/config.yml配置启动的命令操作方式式 - 方式一基于conf/config.yml配置的dbswitch-data模块启动的命令操作方式式
**优点:** **优点:**
@@ -433,7 +433,7 @@ bin/startup.sh
> 不支持CRON表达式的周期执行 > 不支持CRON表达式的周期执行
- 方式二基于conf/application.yml配置启动的WEB使用方式 - 方式二基于conf/application.yml配置的dbswitch-admin模块启动的WEB使用方式
**优点:** **优点:**
@@ -449,7 +449,7 @@ bin/startup.sh
> 多个任务并发执行不易于分析任务错误原因; > 多个任务并发执行不易于分析任务错误原因;
## 四、模块集成与二次开发 ## 四、模块集成开发说明
### 1、dbswitch安装到本地仓库 ### 1、dbswitch安装到本地仓库
@@ -474,7 +474,7 @@ cd dbswitch && mvn clean install
DbswichProperties properties = new DbswichProperties(); DbswichProperties properties = new DbswichProperties();
properties.setXXXX(); properties.setXXXX();
// 将参数传递给dbswitch引起并执行 // 将参数传递给dbswitch启动同步方式执行
MigrationService service = new MigrationService(properties); MigrationService service = new MigrationService(properties);
service.run(); service.run();
``` ```

View File

@@ -386,7 +386,7 @@ export default {
this.$http.delete( this.$http.delete(
"/dbswitch/admin/api/v1/connection/delete/" + row.id "/dbswitch/admin/api/v1/connection/delete/" + row.id
).then(res => { ).then(res => {
console.log(res); //console.log(res);
if (0 === res.data.code) { if (0 === res.data.code) {
this.loadData(); this.loadData();
} else { } else {
@@ -403,7 +403,7 @@ export default {
this.$http.get( this.$http.get(
"/dbswitch/admin/api/v1/connection/test/" + row.id "/dbswitch/admin/api/v1/connection/test/" + row.id
).then(res => { ).then(res => {
console.log(res); //console.log(res);
if (0 === res.data.code) { if (0 === res.data.code) {
alert("测试连接成功!"); alert("测试连接成功!");
} else { } else {
@@ -415,7 +415,7 @@ export default {
let driverClass = ""; let driverClass = "";
if (this.databaseType.length > 0) { if (this.databaseType.length > 0) {
for (let i = 0; i < this.databaseType.length; i++) { for (let i = 0; i < this.databaseType.length; i++) {
console.log(this.databaseType[i]) //console.log(this.databaseType[i])
if (this.databaseType[i].type == this.createform.type) { if (this.databaseType[i].type == this.createform.type) {
driverClass = this.databaseType[i].driver; driverClass = this.databaseType[i].driver;
break; break;
@@ -462,7 +462,7 @@ export default {
let driverClass = ""; let driverClass = "";
if (this.databaseType.length > 0) { if (this.databaseType.length > 0) {
for (let i = 0; i < this.databaseType.length; i++) { for (let i = 0; i < this.databaseType.length; i++) {
console.log(this.databaseType[i]) //console.log(this.databaseType[i])
if (this.databaseType[i].type == this.updateform.type) { if (this.databaseType[i].type == this.updateform.type) {
driverClass = this.databaseType[i].driver; driverClass = this.databaseType[i].driver;
break; break;

View File

@@ -256,7 +256,9 @@ export default {
}, },
mounted () { mounted () {
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
this.myChart.resize(); if (this.myChart && typeof this.myChart.resize == 'function') {
this.myChart.resize();
}
}); });
}, },
updated () { updated () {

View File

@@ -3,16 +3,18 @@
<el-card> <el-card>
<div class="flex-between"> <div class="flex-between">
<div class="tree-container"> <div class="tree-container">
<el-tree class="el-scrollbar" <el-scrollbar style="height:100%">
:props="props" <el-tree class="scroller"
:load="loadNode" :props="props"
:expand-on-click-node="true" :load="loadNode"
:highlight-current="true" :expand-on-click-node="true"
:render-content="renderContent" :highlight-current="true"
@check-change="handleCheckChange" :render-content="renderContent"
@node-click="handleNodeClick" @check-change="handleCheckChange"
lazy> @node-click="handleNodeClick"
</el-tree> lazy>
</el-tree>
</el-scrollbar>
</div> </div>
<div class="table-container"> <div class="table-container">
<span>当前表{{currentNode.schemaName}} / {{currentNode.tableName}}</span> <span>当前表{{currentNode.schemaName}} / {{currentNode.tableName}}</span>
@@ -27,13 +29,6 @@
<el-descriptions-item label="表名称">{{tableMeta.tableName}}</el-descriptions-item> <el-descriptions-item label="表名称">{{tableMeta.tableName}}</el-descriptions-item>
<el-descriptions-item label="表类型">{{tableMeta.type}}</el-descriptions-item> <el-descriptions-item label="表类型">{{tableMeta.type}}</el-descriptions-item>
<el-descriptions-item label="模式名">{{tableMeta.schemaName}}</el-descriptions-item> <el-descriptions-item label="模式名">{{tableMeta.schemaName}}</el-descriptions-item>
<el-descriptions-item label="建表DDL">
<el-input type="textarea"
:rows="16"
v-model="tableMeta.createSql"
auto-complete="off"
:readonly=true></el-input>
</el-descriptions-item>
<el-descriptions-item label="表注释"> <el-descriptions-item label="表注释">
<el-input type="textarea" <el-input type="textarea"
:rows="2" :rows="2"
@@ -41,6 +36,13 @@
auto-complete="off" auto-complete="off"
:readonly=true></el-input> :readonly=true></el-input>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="建表DDL">
<el-input type="textarea"
:rows="16"
v-model="tableMeta.createSql"
auto-complete="off"
:readonly=true></el-input>
</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="字段信息" <el-tab-pane label="字段信息"
@@ -51,7 +53,7 @@
border border
style="width: 100%"> style="width: 100%">
<template slot="empty"> <template slot="empty">
<span>单击左侧展开"数据源导航"来查看表的元数据记录</span> <span>单击左侧展开"数据源导航"来查看表的元数据记录</span>
</template> </template>
<el-table-column prop="fieldName" <el-table-column prop="fieldName"
min-width="20%" min-width="20%"
@@ -104,7 +106,7 @@
:data="sampleData.rows" :data="sampleData.rows"
border> border>
<template slot="empty"> <template slot="empty">
<span>单击左侧展开"数据源导航"来查看表的数据记录</span> <span>单击左侧展开"数据源导航"来查看表的数据记录</span>
</template> </template>
<el-table-column v-for="(item,index) in sampleData.columns" <el-table-column v-for="(item,index) in sampleData.columns"
:prop="item" :prop="item"
@@ -380,7 +382,11 @@ export default {
</script> </script>
<style scoped> <style scoped>
.el-card, .el-card {
width: 100%;
height: 100%;
}
.el-message { .el-message {
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -389,17 +395,15 @@ export default {
.flex-between { .flex-between {
display: flex; display: flex;
} }
.tree-container { .el-scrollbar .el-scrollbar__wrap {overflow-x: hidden;}
overflow: hidden;
background: #f1ecec;
}
.tree-container .el-tree { .tree-container .el-tree {
min-width: 350px; min-width: 350px;
max-width: 350px;
position: relative; position: relative;
cursor: default; cursor: default;
background: #f3f1f1; background: #f3f1f1;
color: #242425; }
.scroller {
min-width: 100%;
} }
.tree-container .tree { .tree-container .tree {
overflow: auto; overflow: auto;

View File

@@ -9,11 +9,20 @@
</div> </div>
<div class="navsBox"> <div class="navsBox">
<ul> <ul>
<li v-for="(item,index) in allTaskAssignments" <li v-for="(item,index) in pageTaskAssignments"
:key="index" :key="index"
@click="handleChooseClick(item.id,index)" @click="handleChooseClick(item.id,index)"
:class="{active:index==isActive}">[{{item.id}}]{{item.name}}</li> :class="{active:index==isActive}">[{{item.id}}]{{item.name}}</li>
</ul> </ul>
<el-pagination small
layout="sizes, prev, pager, next"
@current-change="handleLoadPageTaskAssignments"
:current-page="currentTaskAssignmentPage"
:page-sizes="[10, 15, 20]"
@size-change="handleLoadPageTaskAssignmentsSizeChange"
:page-size="currentTaskAssignmentPageSize"
:total="pageTaskAssignmentsTotalCount">
</el-pagination>
</div> </div>
</el-card> </el-card>
@@ -23,7 +32,7 @@
size="small" size="small"
border> border>
<template slot="empty"> <template slot="empty">
<span>单击左侧任务列表记录来查看作业调度记录</span> <span>记录为空或者单击左侧任务列表记录来查看作业调度记录</span>
</template> </template>
<el-table-column type="expand"> <el-table-column type="expand">
<template slot-scope="props"> <template slot-scope="props">
@@ -110,7 +119,10 @@ export default {
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
totalCount: 0, totalCount: 0,
allTaskAssignments: [], currentTaskAssignmentPage: 1,
currentTaskAssignmentPageSize: 10,
pageTaskAssignments: [],
pageTaskAssignmentsTotalCount: 0,
taskId: '请选择一个任务安排', taskId: '请选择一个任务安排',
jobTableData: [], jobTableData: [],
jobScheduleTime: '', jobScheduleTime: '',
@@ -119,13 +131,14 @@ export default {
}; };
}, },
methods: { methods: {
loadAllTaskAssignments: function () { loadPageTaskAssignments: function () {
this.$http({ this.$http({
method: "GET", method: "GET",
url: "/dbswitch/admin/api/v1/assignment/list/1/10000" url: "/dbswitch/admin/api/v1/assignment/list/" + this.currentTaskAssignmentPage + "/" + this.currentTaskAssignmentPageSize
}).then(res => { }).then(res => {
if (0 === res.data.code) { if (0 === res.data.code) {
this.allTaskAssignments = res.data.data; this.pageTaskAssignments = res.data.data;
this.pageTaskAssignmentsTotalCount = res.data.pagination.total;
} else { } else {
if (res.data.message) { if (res.data.message) {
alert("初始化任务安排信息失败:" + res.data.message); alert("初始化任务安排信息失败:" + res.data.message);
@@ -134,6 +147,14 @@ export default {
} }
); );
}, },
handleLoadPageTaskAssignments: function (currentPage) {
this.currentTaskAssignmentPage = currentPage;
this.loadPageTaskAssignments();
},
handleLoadPageTaskAssignmentsSizeChange: function (pageSize) {
this.currentTaskAssignmentPageSize = pageSize;
this.loadPageTaskAssignments();
},
handleClose: function () { }, handleClose: function () { },
handleSizeChange: function (pageSize) { handleSizeChange: function (pageSize) {
this.loading = true; this.loading = true;
@@ -182,7 +203,7 @@ export default {
} }
}, },
created () { created () {
this.loadAllTaskAssignments(); this.loadPageTaskAssignments();
} }
}; };
</script> </script>
@@ -265,4 +286,5 @@ export default {
padding: 10px; padding: 10px;
width: calc(100% - 250px); width: calc(100% - 250px);
} }
</style> </style>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-admin</artifactId> <artifactId>dbswitch-admin</artifactId>
@@ -118,19 +118,19 @@
<dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version> <version>2.2.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>tk.mybatis</groupId> <groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId> <artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.5</version> <version>4.2.1</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.pagehelper</groupId> <groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version> <version>1.4.2</version>
</dependency> </dependency>
<dependency> <dependency>

View File

@@ -114,8 +114,10 @@ public class DbConnectionController {
@TokenCheck @TokenCheck
@ApiOperation(value = "连接名称") @ApiOperation(value = "连接名称")
@GetMapping(value = "/list/name", produces = MediaType.APPLICATION_JSON_VALUE) @GetMapping(value = "/list/name", produces = MediaType.APPLICATION_JSON_VALUE)
public Result<DbConnectionNameResponse> getNameList() { public PageResult<DbConnectionNameResponse> getNameList(
return databaseConnectionService.getNameList(); @RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "size", required = false) Integer size) {
return databaseConnectionService.getNameList(page, size);
} }
} }

View File

@@ -61,7 +61,7 @@ public class DbConnectionService {
String host = matcher.group("host"); String host = matcher.group("host");
String port = matcher.group("port"); String port = matcher.group("port");
if (null == port) { if (StringUtils.isBlank(port)) {
port = String.valueOf(supportDbType.getPort()); port = String.valueOf(supportDbType.getPort());
} }
@@ -144,8 +144,8 @@ public class DbConnectionService {
public Result<DbConnectionDetailResponse> addDatabaseConnection( public Result<DbConnectionDetailResponse> addDatabaseConnection(
DbConnectionCreateRequest request) { DbConnectionCreateRequest request) {
if (Objects.isNull(request.getName())) { if (StringUtils.isBlank(request.getName())) {
return Result.failed(ResultCode.ERROR_INVALID_ARGUMENT, "name is null"); return Result.failed(ResultCode.ERROR_INVALID_ARGUMENT, "name is empty");
} }
if (Objects.nonNull(databaseConnectionDAO.getByName(request.getName()))) { if (Objects.nonNull(databaseConnectionDAO.getByName(request.getName()))) {
@@ -153,6 +153,7 @@ public class DbConnectionService {
} }
DatabaseConnectionEntity conn = request.toDatabaseConnection(); DatabaseConnectionEntity conn = request.toDatabaseConnection();
validJdbcUrlFormat(conn);
databaseConnectionDAO.insert(conn); databaseConnectionDAO.insert(conn);
return Result.success(ConverterFactory.getConverter(DbConnectionDetailConverter.class) return Result.success(ConverterFactory.getConverter(DbConnectionDetailConverter.class)
@@ -166,7 +167,13 @@ public class DbConnectionService {
return Result.failed(ResultCode.ERROR_RESOURCE_NOT_EXISTS, "id=" + request.getId()); return Result.failed(ResultCode.ERROR_RESOURCE_NOT_EXISTS, "id=" + request.getId());
} }
DatabaseConnectionEntity exist = databaseConnectionDAO.getByName(request.getName());
if (Objects.nonNull(exist) && !exist.getId().equals(request.getId())) {
return Result.failed(ResultCode.ERROR_RESOURCE_ALREADY_EXISTS, "name=" + request.getName());
}
DatabaseConnectionEntity conn = request.toDatabaseConnection(); DatabaseConnectionEntity conn = request.toDatabaseConnection();
validJdbcUrlFormat(conn);
databaseConnectionDAO.updateById(conn); databaseConnectionDAO.updateById(conn);
return Result.success(ConverterFactory.getConverter(DbConnectionDetailConverter.class) return Result.success(ConverterFactory.getConverter(DbConnectionDetailConverter.class)
@@ -177,12 +184,15 @@ public class DbConnectionService {
databaseConnectionDAO.deleteById(id); databaseConnectionDAO.deleteById(id);
} }
public Result<DbConnectionNameResponse> getNameList() { public PageResult<DbConnectionNameResponse> getNameList(Integer page, Integer size) {
List<DatabaseConnectionEntity> lists = databaseConnectionDAO.listAll(null); Supplier<List<DbConnectionNameResponse>> method = () -> {
List<DbConnectionNameResponse> ret = lists.parallelStream() List<DatabaseConnectionEntity> lists = databaseConnectionDAO.listAll(null);
.map(c -> new DbConnectionNameResponse(c.getId(), c.getName())) return lists.stream()
.collect(Collectors.toList()); .map(c -> new DbConnectionNameResponse(c.getId(), c.getName()))
return Result.success(ret); .collect(Collectors.toList());
};
return PageUtils.getPage(method, page, size);
} }
public DatabaseConnectionEntity getDatabaseConnectionById(Long id) { public DatabaseConnectionEntity getDatabaseConnectionById(Long id) {
@@ -193,4 +203,30 @@ public class DbConnectionService {
return dbConn; return dbConn;
} }
private void validJdbcUrlFormat(DatabaseConnectionEntity conn) {
String typeName = conn.getType().getName().toUpperCase();
SupportDbTypeEnum supportDbType = SupportDbTypeEnum.valueOf(typeName);
if (!conn.getUrl().startsWith(supportDbType.getUrlPrefix())) {
throw new DbswitchException(ResultCode.ERROR_INVALID_JDBC_URL, conn.getUrl());
}
for (int i = 0; i < supportDbType.getUrl().length; ++i) {
String pattern = supportDbType.getUrl()[i];
Matcher matcher = JDBCURL.getPattern(pattern).matcher(conn.getUrl());
if (!matcher.matches()) {
if (i == supportDbType.getUrl().length - 1) {
throw new DbswitchException(ResultCode.ERROR_INVALID_JDBC_URL, conn.getUrl());
}
} else {
if (supportDbType.hasDatabaseName() && StringUtils.isBlank(matcher.group("database"))) {
throw new DbswitchException(ResultCode.ERROR_INVALID_JDBC_URL,
"库名没有指定 :" + conn.getUrl());
}
break;
}
}
}
} }

View File

@@ -17,24 +17,42 @@ import org.springframework.util.StringUtils;
@AllArgsConstructor @AllArgsConstructor
public enum SupportDbTypeEnum { public enum SupportDbTypeEnum {
MYSQL(1, "mysql", "com.mysql.jdbc.Driver", 3306, "/* ping */ SELECT 1", MYSQL(1, "mysql", "com.mysql.jdbc.Driver", 3306,
"/* ping */ SELECT 1",
"jdbc:mysql://",
new String[]{"jdbc:mysql://{host}[:{port}]/[{database}][\\?{params}]"}), new String[]{"jdbc:mysql://{host}[:{port}]/[{database}][\\?{params}]"}),
MARIADB(2, "mariadb", "org.mariadb.jdbc.Driver", 3306, "SELECT 1", MARIADB(2, "mariadb", "org.mariadb.jdbc.Driver", 3306,
"SELECT 1",
"jdbc:mariadb://",
new String[]{"jdbc:mariadb://{host}[:{port}]/[{database}][\\?{params}]"}), new String[]{"jdbc:mariadb://{host}[:{port}]/[{database}][\\?{params}]"}),
ORACLE(3, "oracle", "oracle.jdbc.driver.OracleDriver", 1521, "SELECT 'Hello' from DUAL", ORACLE(3, "oracle", "oracle.jdbc.driver.OracleDriver", 1521,
new String[]{"jdbc:oracle:thin:@{host}:{port}:{name}", "SELECT 'Hello' from DUAL",
"jdbc:oracle:thin:@//{host}[:{port}]/{name}"}), "jdbc:oracle:thin:@",
SQLSERVER(4, "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", 1433, "SELECT 1+2 as a", new String[]{"jdbc:oracle:thin:@{host}:{port}:{database}",
new String[]{"jdbc:sqlserver://{host}[:{port}][;databaseName={database}][;{params}]"}), "jdbc:oracle:thin:@//{host}[:{port}]/{database}"}),
POSTGRESQL(5, "postgresql", "org.postgresql.Driver", 5432, "SELECT 1", SQLSERVER(4, "sqlserver", "com.microsoft.sqlserver.jdbc.SQLServerDriver", 1433,
"SELECT 1+2 as a",
"jdbc:sqlserver://",
new String[]{"jdbc:sqlserver://{host}[:{port}][;DatabaseName={database}][;{params}]"}),
POSTGRESQL(5, "postgresql", "org.postgresql.Driver", 5432,
"SELECT 1",
"jdbc:postgresql://",
new String[]{"jdbc:postgresql://{host}[:{port}]/[{database}][\\?{params}]"}), new String[]{"jdbc:postgresql://{host}[:{port}]/[{database}][\\?{params}]"}),
DB2(6, "db2", "com.ibm.db2.jcc.DB2Driver", 50000, "SELECT 1 FROM SYSIBM.SYSDUMMY1", DB2(6, "db2", "com.ibm.db2.jcc.DB2Driver", 50000,
"SELECT 1 FROM SYSIBM.SYSDUMMY1",
"jdbc:db2://",
new String[]{"jdbc:db2://{host}:{port}/{database}[:{params}]"}), new String[]{"jdbc:db2://{host}:{port}/{database}[:{params}]"}),
DM(7, "dm", "dm.jdbc.driver.DmDriver", 5236, "SELECT 'Hello' from DUAL", DM(7, "dm", "dm.jdbc.driver.DmDriver", 5236,
"SELECT 'Hello' from DUAL",
"jdbc:dm://",
new String[]{"jdbc:dm://{host}:{port}[/{database}][\\?{params}]"}), new String[]{"jdbc:dm://{host}:{port}[/{database}][\\?{params}]"}),
KINGBASE(8, "kingbase", "com.kingbase8.Driver", 54321, "SELECT 1", KINGBASE(8, "kingbase", "com.kingbase8.Driver", 54321,
"SELECT 1",
"jdbc:kingbase8://",
new String[]{"jdbc:kingbase8://{host}[:{port}]/[{database}][\\?{params}]"}), new String[]{"jdbc:kingbase8://{host}[:{port}]/[{database}][\\?{params}]"}),
HIVE(1, "hive", "org.apache.hive.jdbc.HiveDriver", 10000, "SELECT 1", HIVE(1, "hive", "org.apache.hive.jdbc.HiveDriver", 10000,
"SELECT 1",
"jdbc:hive2://",
new String[]{"jdbc:hive2://{host}[:{port}]/[{database}][\\?{params}]"}), new String[]{"jdbc:hive2://{host}[:{port}]/[{database}][\\?{params}]"}),
; ;
@@ -43,8 +61,13 @@ public enum SupportDbTypeEnum {
private String driver; private String driver;
private int port; private int port;
private String sql; private String sql;
private String urlPrefix;
private String[] url; private String[] url;
public boolean hasDatabaseName() {
return this != DM;
}
public static SupportDbTypeEnum of(String name) { public static SupportDbTypeEnum of(String name) {
if (!StringUtils.isEmpty(name)) { if (!StringUtils.isEmpty(name)) {
for (SupportDbTypeEnum type : SupportDbTypeEnum.values()) { for (SupportDbTypeEnum type : SupportDbTypeEnum.values()) {

View File

@@ -206,10 +206,10 @@ public class JDBCURL {
} }
// 6、Microsoft SQLServer数据库 // 6、Microsoft SQLServer数据库
// jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;user=MyUserName;password=123456; // jdbc:sqlserver://localhost:1433;DatabaseName=AdventureWorks;user=MyUserName;password=123456;
final Matcher matcher5 = JDBCURL final Matcher matcher5 = JDBCURL
.getPattern("jdbc:sqlserver://{host}[:{port}][;databaseName={database}][;{params}]") .getPattern("jdbc:sqlserver://{host}[:{port}][;DatabaseName={database}][;{params}]")
.matcher("jdbc:sqlserver://localhost:1433;databaseName=master;user=MyUserName"); .matcher("jdbc:sqlserver://localhost:1433;DatabaseName=master;user=MyUserName");
if (matcher5.matches()) { if (matcher5.matches()) {
System.out.println("sqlserver host:" + matcher5.group("host")); System.out.println("sqlserver host:" + matcher5.group("host"));
System.out.println("sqlserver port:" + matcher5.group("port")); System.out.println("sqlserver port:" + matcher5.group("port"));

View File

@@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>异构数据迁移工具</title><link href=/static/css/app.5ecc6abf3a20668fd115c18e59dc362b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.cbc4b16180a8bf2afd41.js></script><script type=text/javascript src=/static/js/vendor.d6c2f50c2f02bf33c8cf.js></script><script type=text/javascript src=/static/js/app.418d956a43293c6e0efb.js></script></body></html> <!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>异构数据迁移工具</title><link href=/static/css/app.bc83f5316094e8a72597c94a4443f6b3.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.80c42f725fd3b643f80d.js></script><script type=text/javascript src=/static/js/vendor.d6c2f50c2f02bf33c8cf.js></script><script type=text/javascript src=/static/js/app.2dd7015ae4fe3dd7fe2e.js></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
webpackJsonp([11],{"0eSS":function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l={data:function(){return{loading:!0,lists:[],currentPage:1,pageSize:10,totalCount:0}},methods:{loadData:function(){var e=this;this.$http.get("/dbswitch/admin/api/v1/syslog/list/2/"+this.currentPage+"/"+this.pageSize).then(function(t){e.loading=!1,0===t.data.code?(e.currentPage=t.data.pagination.page,e.pageSize=t.data.pagination.size,e.totalCount=t.data.pagination.total,e.lists=t.data.data):alert("加载数据失败:"+t.data.message)},function(t){e.$message({showClose:!0,message:"数据加载错误",type:"error"})})},boolFormat:function(e,t){return!0===e.failed?"是":"否"},handleSizeChange:function(e){this.loading=!0,this.pageSize=e,this.loadData()},handleCurrentChange:function(e){this.loading=!0,this.currentPage=e,this.loadData()},handleDetail:function(e,t){this.$message({showClose:!0,message:"查看日志详情"+e+" "+t,type:"info"})}},created:function(){this.loadData()}},o={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticStyle:{"margin-top":"15px"}},[a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{"element-loading-text":"拼命加载中","element-loading-spinner":"el-icon-loading","element-loading-background":"rgba(0, 0, 0, 0.8)",data:e.lists,stripe:"",size:"small",border:""}},[a("el-table-column",{attrs:{type:"expand"},scopedSlots:e._u([{key:"default",fn:function(t){return[a("el-form",{staticClass:"demo-table-expand",attrs:{"label-position":"left",inline:""}},[a("el-form-item",{attrs:{label:"日志编号:"}},[a("span",[e._v(e._s(t.row.id))])]),e._v(" "),a("el-form-item",{attrs:{label:"日志时间:"}},[a("span",[e._v(e._s(t.row.createTime))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作用户:"}},[a("span",[e._v(e._s(t.row.username))])]),e._v(" "),a("el-form-item",{attrs:{label:"请求IP地址:"}},[a("span",[e._v(e._s(t.row.ipAddress))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作模块:"}},[a("span",[e._v(e._s(t.row.moduleName))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作描述:"}},[a("span",[e._v(e._s(t.row.content))])]),e._v(" "),a("el-form-item",{attrs:{label:"处理耗时(ms):"}},[a("span",[e._v(e._s(t.row.elapseSeconds))])]),e._v(" "),a("el-form-item",{attrs:{label:"请求路径:"}},[a("span",[e._v(e._s(t.row.urlPath))])]),e._v(" "),a("el-form-item",{attrs:{label:"异常状态:"}},[a("span",[e._v(e._s(t.row.failed))])]),e._v(" "),a("el-form-item",{attrs:{label:""}},[a("span")]),e._v(" "),a("el-form-item",{attrs:{label:"异常日志:"}},[a("el-input",{staticStyle:{"font-size":"12px",width:"700px"},attrs:{type:"textarea",autosize:{minRows:2,maxRows:5}},model:{value:t.row.exception,callback:function(a){e.$set(t.row,"exception",a)},expression:"props.row.exception"}})],1)],1)]}}])}),e._v(" "),a("el-table-column",{attrs:{prop:"createTime",label:"日志时间","min-width":"15%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"username",label:"操作用户","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"ipAddress",label:"请求IP","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"moduleName",label:"操作类型","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"elapseSeconds",label:"耗时(ms)","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"urlPath",label:"请求路径","min-width":"20%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"failed",label:"异常",formatter:e.boolFormat,"min-width":"10%","show-overflow-tooltip":!0}})],1),e._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("el-pagination",{attrs:{"current-page":e.currentPage,"page-sizes":[5,10,20,40],"page-size":e.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:e.totalCount},on:{"size-change":e.handleSizeChange,"current-change":e.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var n=a("VU/8")(l,o,!1,function(e){a("sACR")},"data-v-5a0d71c9",null);t.default=n.exports},sACR:function(e,t){}}); webpackJsonp([10],{"0eSS":function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var l={data:function(){return{loading:!0,lists:[],currentPage:1,pageSize:10,totalCount:0}},methods:{loadData:function(){var e=this;this.$http.get("/dbswitch/admin/api/v1/syslog/list/2/"+this.currentPage+"/"+this.pageSize).then(function(t){e.loading=!1,0===t.data.code?(e.currentPage=t.data.pagination.page,e.pageSize=t.data.pagination.size,e.totalCount=t.data.pagination.total,e.lists=t.data.data):alert("加载数据失败:"+t.data.message)},function(t){e.$message({showClose:!0,message:"数据加载错误",type:"error"})})},boolFormat:function(e,t){return!0===e.failed?"是":"否"},handleSizeChange:function(e){this.loading=!0,this.pageSize=e,this.loadData()},handleCurrentChange:function(e){this.loading=!0,this.currentPage=e,this.loadData()},handleDetail:function(e,t){this.$message({showClose:!0,message:"查看日志详情"+e+" "+t,type:"info"})}},created:function(){this.loadData()}},o={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticStyle:{"margin-top":"15px"}},[a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{"element-loading-text":"拼命加载中","element-loading-spinner":"el-icon-loading","element-loading-background":"rgba(0, 0, 0, 0.8)",data:e.lists,stripe:"",size:"small",border:""}},[a("el-table-column",{attrs:{type:"expand"},scopedSlots:e._u([{key:"default",fn:function(t){return[a("el-form",{staticClass:"demo-table-expand",attrs:{"label-position":"left",inline:""}},[a("el-form-item",{attrs:{label:"日志编号:"}},[a("span",[e._v(e._s(t.row.id))])]),e._v(" "),a("el-form-item",{attrs:{label:"日志时间:"}},[a("span",[e._v(e._s(t.row.createTime))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作用户:"}},[a("span",[e._v(e._s(t.row.username))])]),e._v(" "),a("el-form-item",{attrs:{label:"请求IP地址:"}},[a("span",[e._v(e._s(t.row.ipAddress))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作模块:"}},[a("span",[e._v(e._s(t.row.moduleName))])]),e._v(" "),a("el-form-item",{attrs:{label:"操作描述:"}},[a("span",[e._v(e._s(t.row.content))])]),e._v(" "),a("el-form-item",{attrs:{label:"处理耗时(ms):"}},[a("span",[e._v(e._s(t.row.elapseSeconds))])]),e._v(" "),a("el-form-item",{attrs:{label:"请求路径:"}},[a("span",[e._v(e._s(t.row.urlPath))])]),e._v(" "),a("el-form-item",{attrs:{label:"异常状态:"}},[a("span",[e._v(e._s(t.row.failed))])]),e._v(" "),a("el-form-item",{attrs:{label:""}},[a("span")]),e._v(" "),a("el-form-item",{attrs:{label:"异常日志:"}},[a("el-input",{staticStyle:{"font-size":"12px",width:"700px"},attrs:{type:"textarea",autosize:{minRows:2,maxRows:5}},model:{value:t.row.exception,callback:function(a){e.$set(t.row,"exception",a)},expression:"props.row.exception"}})],1)],1)]}}])}),e._v(" "),a("el-table-column",{attrs:{prop:"createTime",label:"日志时间","min-width":"15%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"username",label:"操作用户","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"ipAddress",label:"请求IP","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"moduleName",label:"操作类型","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"elapseSeconds",label:"耗时(ms)","min-width":"10%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"urlPath",label:"请求路径","min-width":"20%","show-overflow-tooltip":!0}}),e._v(" "),a("el-table-column",{attrs:{prop:"failed",label:"异常",formatter:e.boolFormat,"min-width":"10%","show-overflow-tooltip":!0}})],1),e._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("el-pagination",{attrs:{"current-page":e.currentPage,"page-sizes":[5,10,20,40],"page-size":e.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:e.totalCount},on:{"size-change":e.handleSizeChange,"current-change":e.handleCurrentChange}})],1)],1)},staticRenderFns:[]};var n=a("VU/8")(l,o,!1,function(e){a("sACR")},"data-v-5a0d71c9",null);t.default=n.exports},sACR:function(e,t){}});
//# sourceMappingURL=11.f892b415a253bac53fa8.js.map //# sourceMappingURL=10.ec3b8253b1c336df3447.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +0,0 @@
webpackJsonp([13],{"mKp/":function(t,a,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var s={data:function(){return{loading:!0,currentPage:1,pageSize:10,totalCount:0,allTaskAssignments:[],taskId:"请选择一个任务安排",jobTableData:[],jobScheduleTime:"",isActive:-1,array:[]}},methods:{loadAllTaskAssignments:function(){var t=this;this.$http({method:"GET",url:"/dbswitch/admin/api/v1/assignment/list/1/10000"}).then(function(a){0===a.data.code?t.allTaskAssignments=a.data.data:a.data.message&&alert("初始化任务安排信息失败:"+a.data.message)})},handleClose:function(){},handleSizeChange:function(t){this.loading=!0,this.pageSize=t,this.loadJobsData()},handleCurrentChange:function(t){this.loading=!0,this.currentPage=t,this.loadJobsData()},loadJobsData:function(){var t=this;this.$http.get("/dbswitch/admin/api/v1/ops/jobs/list/"+this.currentPage+"/"+this.pageSize+"?id="+this.taskId).then(function(a){0===a.data.code?(t.currentPage=a.data.pagination.page,t.pageSize=a.data.pagination.size,t.totalCount=a.data.pagination.total,t.jobTableData=a.data.data):a.data.message&&alert("查询JOB执行历史纪录失败,"+a.data.message)})},handleChooseClick:function(t,a){this.isActive=a,this.taskId=t,this.loadJobsData()},handleCancelJob:function(t){var a=this;this.$http.get("/dbswitch/admin/api/v1/ops/job/cancel?id="+t).then(function(t){0===t.data.code?(a.$message("停止JOB成功"),a.loadJobsData()):t.data.message&&alert("JOB停止失败,"+t.data.message)})}},created:function(){this.loadAllTaskAssignments()}},l={render:function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",[e("el-card",[e("div",{staticClass:"container"},[e("el-card",{staticClass:"box-card"},[e("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[e("span",[t._v("任务安排列表")])]),t._v(" "),e("div",{staticClass:"navsBox"},[e("ul",t._l(t.allTaskAssignments,function(a,s){return e("li",{key:s,class:{active:s==t.isActive},on:{click:function(e){return t.handleChooseClick(a.id,s)}}},[t._v("["+t._s(a.id)+"]"+t._s(a.name))])}),0)])]),t._v(" "),e("div",{staticClass:"contentBox"},[e("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.jobTableData,size:"small",border:""}},[e("template",{slot:"empty"},[e("span",[t._v("单击左侧任务列表记录来查看作业调度记录")])]),t._v(" "),e("el-table-column",{attrs:{type:"expand"},scopedSlots:t._u([{key:"default",fn:function(a){return[e("el-form",{staticClass:"demo-table-expand",attrs:{"label-position":"left",inline:""}},[e("el-form-item",{attrs:{label:"JOB编号:"}},[e("span",[t._v(t._s(a.row.jobId))])]),t._v(" "),e("el-form-item",{attrs:{label:"调度方式:"}},[e("span",[t._v(t._s(a.row.scheduleMode))])]),t._v(" "),e("el-form-item",{attrs:{label:"开始时间:"}},[e("span",[t._v(t._s(a.row.startTime))])]),t._v(" "),e("el-form-item",{attrs:{label:"结束时间:"}},[e("span",[t._v(t._s(a.row.finishTime))])]),t._v(" "),e("el-form-item",{attrs:{label:"执行状态:"}},[e("span",[t._v(t._s(a.row.jobStatus))])]),t._v(" "),e("el-form-item",{attrs:{label:"操作:"}},["1"==a.row.status?e("el-button",{attrs:{size:"small",type:"danger"},on:{click:function(e){return t.handleCancelJob(a.row.jobId)}}},[t._v("\n 停止\n ")]):t._e()],1),t._v(" "),e("el-form-item",{attrs:{label:"异常日志:"}},[e("el-input",{staticStyle:{"font-size":"12px",width:"700px"},attrs:{type:"textarea",autosize:{minRows:2,maxRows:5}},model:{value:a.row.errorLog,callback:function(e){t.$set(a.row,"errorLog",e)},expression:"props.row.errorLog"}})],1)],1)]}}])}),t._v(" "),e("el-table-column",{attrs:{property:"jobId",label:"ID",width:"60"}}),t._v(" "),e("el-table-column",{attrs:{property:"assignmentId",label:"任务ID",width:"80"}}),t._v(" "),e("el-table-column",{attrs:{property:"scheduleMode",label:"调度方式",width:"80"}}),t._v(" "),e("el-table-column",{attrs:{property:"startTime",label:"开始时间",width:"160"}}),t._v(" "),e("el-table-column",{attrs:{property:"finishTime",label:"结束时间",width:"160"}}),t._v(" "),e("el-table-column",{attrs:{property:"duration",label:"持续时长(s)",width:"100"}}),t._v(" "),e("el-table-column",{attrs:{property:"jobStatus",label:"执行状态",width:"100"}})],2),t._v(" "),e("div",{staticClass:"page",attrs:{align:"right"}},[e("el-pagination",{attrs:{"current-page":t.currentPage,"page-sizes":[5,10,20,40],"page-size":t.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.totalCount},on:{"size-change":t.handleSizeChange,"current-change":t.handleCurrentChange}})],1)],1)],1)])],1)},staticRenderFns:[]};var n=e("VU/8")(s,l,!1,function(t){e("sSvd")},"data-v-315acdde",null);a.default=n.exports},sSvd:function(t,a){}});
//# sourceMappingURL=13.a95a8fc1f81d32bcfc9c.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
webpackJsonp([17],{NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),a=t("7+uW"),u={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var c=t("VU/8")({name:"App"},u,!1,function(n){t("Pibb")},"data-v-a97617c2",null).exports,i=t("/ocq");a.default.use(i.a);var l=new i.a({routes:[{path:"/",name:"首页",component:function(){return t.e(4).then(t.bind(null,"4er+"))},redirect:"/dashboard",children:[{path:"/dashboard",name:"概览",icon:"el-icon-menu",component:function(){return Promise.all([t.e(0),t.e(8)]).then(t.bind(null,"ARoL"))}},{path:"/connection",name:"连接管理",icon:"el-icon-s-order",component:function(){return Promise.all([t.e(0),t.e(10)]).then(t.bind(null,"qdtB"))}},{path:"/metadata",name:"数据目录",icon:"el-icon-coin",component:function(){return t.e(1).then(t.bind(null,"PJ2q"))}},{path:"/task",name:"任务管理",icon:"el-icon-s-tools",component:function(){return t.e(6).then(t.bind(null,"4KEO"))},children:[{path:"/task/assignment",name:"任务安排",icon:"el-icon-eleme",component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"D0I9"))}},{path:"/task/schedule",name:"调度记录",icon:"el-icon-pie-chart",component:function(){return t.e(13).then(t.bind(null,"mKp/"))}}]},{path:"/log",name:"审计日志",icon:"el-icon-platform-eleme",component:function(){return t.e(7).then(t.bind(null,"QWih"))},children:[{path:"/log/access",name:"登录日志",icon:"el-icon-eleme",component:function(){return t.e(15).then(t.bind(null,"oQRv"))}},{path:"/log/action",name:"操作日志",icon:"el-icon-s-check",component:function(){return t.e(11).then(t.bind(null,"0eSS"))}}]},{path:"/about",name:"关于系统",icon:"el-icon-s-custom",component:function(){return t.e(2).then(t.bind(null,"m25N"))}},{path:"/user/personal",name:"个人中心",hidden:!0,component:function(){return t.e(3).then(t.bind(null,"uTKz"))}},{path:"/task/create",name:"创建任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"/rCC"))}},{path:"/task/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(9)]).then(t.bind(null,"txod"))}}]},{path:"/login",name:"登录",component:function(){return t.e(5).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),s=t.n(p).a.create();s.interceptors.request.use(function(n){return n.url=""+n.url,n});var d=s,m=t("zL8q"),h=t.n(m),f=(t("muQq"),t("tvR6"),t("7Vno")),b=t.n(f),v=t("XLwt"),g=t.n(v);a.default.use(d),a.default.use(h.a),a.default.use(b.a),a.default.prototype.$http=d,a.default.config.productionTip=!1,a.default.prototype.$echarts=g.a,d.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return r.a.reject(n)}),d.interceptors.response.use(function(n){return!n.data||401!==n.data.code&&403!==n.data.code&&404!==n.data.code||l.push({path:"/login"}),n},function(n){return console.log(n),r.a.reject(n.response)}),new a.default({el:"#app",router:l,components:{App:c},template:"<App/>"})},Pibb:function(n,e){},muQq:function(n,e){},tvR6:function(n,e){}},["NHnr"]); webpackJsonp([17],{NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),a=t("7+uW"),u={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var c=t("VU/8")({name:"App"},u,!1,function(n){t("Pibb")},"data-v-a97617c2",null).exports,i=t("/ocq");a.default.use(i.a);var l=new i.a({routes:[{path:"/",name:"首页",component:function(){return t.e(4).then(t.bind(null,"4er+"))},redirect:"/dashboard",children:[{path:"/dashboard",name:"概览",icon:"el-icon-menu",component:function(){return Promise.all([t.e(0),t.e(8)]).then(t.bind(null,"ARoL"))}},{path:"/connection",name:"连接管理",icon:"el-icon-s-order",component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"qdtB"))}},{path:"/metadata",name:"数据目录",icon:"el-icon-coin",component:function(){return t.e(1).then(t.bind(null,"PJ2q"))}},{path:"/task",name:"任务管理",icon:"el-icon-s-tools",component:function(){return t.e(6).then(t.bind(null,"4KEO"))},children:[{path:"/task/assignment",name:"任务安排",icon:"el-icon-eleme",component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"D0I9"))}},{path:"/task/schedule",name:"调度记录",icon:"el-icon-pie-chart",component:function(){return t.e(13).then(t.bind(null,"mKp/"))}}]},{path:"/log",name:"审计日志",icon:"el-icon-platform-eleme",component:function(){return t.e(7).then(t.bind(null,"QWih"))},children:[{path:"/log/access",name:"登录日志",icon:"el-icon-eleme",component:function(){return t.e(15).then(t.bind(null,"oQRv"))}},{path:"/log/action",name:"操作日志",icon:"el-icon-s-check",component:function(){return t.e(10).then(t.bind(null,"0eSS"))}}]},{path:"/about",name:"关于系统",icon:"el-icon-s-custom",component:function(){return t.e(2).then(t.bind(null,"m25N"))}},{path:"/user/personal",name:"个人中心",hidden:!0,component:function(){return t.e(3).then(t.bind(null,"uTKz"))}},{path:"/task/create",name:"创建任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(11)]).then(t.bind(null,"/rCC"))}},{path:"/task/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(9)]).then(t.bind(null,"txod"))}}]},{path:"/login",name:"登录",component:function(){return t.e(5).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),s=t.n(p).a.create();s.interceptors.request.use(function(n){return n.url=""+n.url,n});var d=s,m=t("zL8q"),h=t.n(m),f=(t("muQq"),t("tvR6"),t("7Vno")),b=t.n(f),v=t("XLwt"),g=t.n(v);a.default.use(d),a.default.use(h.a),a.default.use(b.a),a.default.prototype.$http=d,a.default.config.productionTip=!1,a.default.prototype.$echarts=g.a,d.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return r.a.reject(n)}),d.interceptors.response.use(function(n){return!n.data||401!==n.data.code&&403!==n.data.code&&404!==n.data.code||l.push({path:"/login"}),n},function(n){return console.log(n),r.a.reject(n.response)}),new a.default({el:"#app",router:l,components:{App:c},template:"<App/>"})},Pibb:function(n,e){},muQq:function(n,e){},tvR6:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.418d956a43293c6e0efb.js.map //# sourceMappingURL=app.2dd7015ae4fe3dd7fe2e.js.map

View File

@@ -0,0 +1,2 @@
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,c){for(var f,d,i,u=0,s=[];u<r.length;u++)d=r[u],t[d]&&s.push(t[d][0]),t[d]=0;for(f in o)Object.prototype.hasOwnProperty.call(o,f)&&(e[f]=o[f]);for(n&&n(r,o,c);s.length;)s.shift()();if(c)for(u=0;u<c.length;u++)i=a(a.s=c[u]);return i};var r={},t={18:0};function a(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,a){n=t[e]=[r,a]});n[2]=r;var o=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,a.nc&&c.setAttribute("nonce",a.nc),c.src=a.p+"static/js/"+e+"."+{0:"ca67e87d8c000a42e592",1:"bd90a7e98064156140b6",2:"45757fdd22b0c905f12a",3:"d4c1dc7b68edb49b61d2",4:"c4abd62fbe15189d37a5",5:"837a4a67f1fcf6ee6c6a",6:"7f56c2238fb7e4ee2ecd",7:"d5dc80a855f66a3208ff",8:"2bf951413fb931374230",9:"729e286f79df81fea7d3",10:"ec3b8253b1c336df3447",11:"698a50794af7c9a68ca6",12:"5d3ab6a26a8047df4873",13:"eaa4da512adb13b7d4fd",14:"cadc6af4835efe7c42e4",15:"dec790aca8fa0a8e930a"}[e]+".js";var f=setTimeout(d,12e4);function d(){c.onerror=c.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=d,o.appendChild(c),r},a.m=e,a.c=r,a.d=function(e,n,r){a.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},a.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(n,"a",n),n},a.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},a.p="/",a.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.80c42f725fd3b643f80d.js.map

View File

@@ -1,2 +0,0 @@
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,o){for(var f,d,i,u=0,s=[];u<r.length;u++)d=r[u],t[d]&&s.push(t[d][0]),t[d]=0;for(f in c)Object.prototype.hasOwnProperty.call(c,f)&&(e[f]=c[f]);for(n&&n(r,c,o);s.length;)s.shift()();if(o)for(u=0;u<o.length;u++)i=a(a.s=o[u]);return i};var r={},t={18:0};function a(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,a),t.l=!0,t.exports}a.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,a){n=t[e]=[r,a]});n[2]=r;var c=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,a.nc&&o.setAttribute("nonce",a.nc),o.src=a.p+"static/js/"+e+"."+{0:"ca67e87d8c000a42e592",1:"e3d4daa7d15a531ade81",2:"45757fdd22b0c905f12a",3:"d4c1dc7b68edb49b61d2",4:"c4abd62fbe15189d37a5",5:"837a4a67f1fcf6ee6c6a",6:"7f56c2238fb7e4ee2ecd",7:"d5dc80a855f66a3208ff",8:"07c5486141568381ea3e",9:"729e286f79df81fea7d3",10:"f5b649582844e192d384",11:"f892b415a253bac53fa8",12:"de5a454fa0c65c9c60a4",13:"a95a8fc1f81d32bcfc9c",14:"cadc6af4835efe7c42e4",15:"dec790aca8fa0a8e930a"}[e]+".js";var f=setTimeout(d,12e4);function d(){o.onerror=o.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return o.onerror=o.onload=d,c.appendChild(o),r},a.m=e,a.c=r,a.d=function(e,n,r){a.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},a.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(n,"a",n),n},a.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},a.p="/",a.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.cbc4b16180a8bf2afd41.js.map

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-common</artifactId> <artifactId>dbswitch-common</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-core</artifactId> <artifactId>dbswitch-core</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-data</artifactId> <artifactId>dbswitch-data</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-dbchange</artifactId> <artifactId>dbswitch-dbchange</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-dbcommon</artifactId> <artifactId>dbswitch-dbcommon</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-dbsynch</artifactId> <artifactId>dbswitch-dbsynch</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-dbwriter</artifactId> <artifactId>dbswitch-dbwriter</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-pgwriter</artifactId> <artifactId>dbswitch-pgwriter</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>dbswitch-sql</artifactId> <artifactId>dbswitch-sql</artifactId>

View File

@@ -5,7 +5,7 @@
<parent> <parent>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
</parent> </parent>
<artifactId>package-tool</artifactId> <artifactId>package-tool</artifactId>

View File

@@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.gitee.dbswitch</groupId> <groupId>com.gitee.dbswitch</groupId>
<artifactId>dbswitch-parent</artifactId> <artifactId>dbswitch-parent</artifactId>
<version>1.6.7</version> <version>1.6.8</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>dbswitch</name> <name>dbswitch</name>
<description>database switch project</description> <description>database switch project</description>

View File

@@ -1,6 +1,6 @@
@echo off @echo off
set APP_VERSION=1.6.7 set APP_VERSION=1.6.8
echo "Clean Project ..." echo "Clean Project ..."
call mvn clean -f pom.xml call mvn clean -f pom.xml