前端页面优化

This commit is contained in:
inrgihc
2023-09-17 00:10:16 +08:00
parent d31427f22a
commit 14ee86bcd1
38 changed files with 373 additions and 155 deletions

View File

@@ -32,7 +32,7 @@
基于JDBC的分批次读取源端数据库数据并基于insert/copy方式将数据分批写入目的数据库 基于JDBC的分批次读取源端数据库数据并基于insert/copy方式将数据分批写入目的数据库
</p> </p>
<p> <p>
支持有主键表的 增量变更同步 变化数据计算Change Data Calculate功能 支持有主键表的"变化量"同步 变化数据计算Change Data Calculate功能
</p> </p>
</ul> </ul>
</div> </div>
@@ -49,7 +49,7 @@
<el-card class="box-card"> <el-card class="box-card">
<div class="text item"> <div class="text item">
<p> <p>
dbswitch提供异构关系数据库间的数据迁移同步支持绝大多数关系型数据库包括 dbswitch提供异构关系数据库间的数据迁移同步支持多种数据库包括
</p> </p>
<ul> <ul>
<li>甲骨文的Oracle <li>甲骨文的Oracle
@@ -78,10 +78,14 @@
</li> </li>
<li>国产南大通用数据库GBase8a <li>国产南大通用数据库GBase8a
</li> </li>
<li>Apache Hive(只支持为源端) <li>Apache Hive(基于JdbcStorageHandler)
</li> </li>
<li>SQLite3 <li>SQLite3
</li> </li>
<li>OpenGuass
</li>
<li>MongoDB
</li>
</ul> </ul>
</div> </div>
</el-card> </el-card>
@@ -113,10 +117,13 @@
dbswitch-product-oscar // -> oscar方言实现类 dbswitch-product-oscar // -> oscar方言实现类
dbswitch-product-gbase // -> gbase方言实现类 dbswitch-product-gbase // -> gbase方言实现类
dbswitch-product-mariadb // -> mariadb方言实现类 dbswitch-product-mariadb // -> mariadb方言实现类
dbswitch-product-openguass// -> openguass方言实现类
dbswitch-product-db2 // -> db2方言实现类 dbswitch-product-db2 // -> db2方言实现类
dbswitch-product-sybase // -> sybase方言实现类 dbswitch-product-sybase // -> sybase方言实现类
dbswitch-product-hive // -> hive方言实现类 dbswitch-product-hive // -> hive方言实现类
dbswitch-product-sqlite // -> sqlite方言实现类 dbswitch-product-sqlite // -> sqlite方言实现类
dbswitch-product-openguass// -> openguass方言实现类
dbswitch-product-mongodb // -> mongodb方言实现类
dbswitch-data // 工具入口模块,读取配置文件中的参数执行异构迁移同步 dbswitch-data // 工具入口模块,读取配置文件中的参数执行异构迁移同步
dbswitch-admin // 在以上模块的基础上引入Quartz的调度服务与接口 dbswitch-admin // 在以上模块的基础上引入Quartz的调度服务与接口
dbswitch-admin-ui // 基于Vue2的前段WEB交互页面 dbswitch-admin-ui // 基于Vue2的前段WEB交互页面

View File

@@ -88,6 +88,7 @@ export default {
}).then(res => { }).then(res => {
if (0 === res.data.code) { if (0 === res.data.code) {
this.connectionTypes = res.data.data; this.connectionTypes = res.data.data;
this.handleChooseClick('MYSQL',0);
} else { } else {
if (res.data.message) { if (res.data.message) {
alert("初始化数据库类型信息失败:" + res.data.message); alert("初始化数据库类型信息失败:" + res.data.message);

View File

@@ -1,13 +1,24 @@
<template> <template>
<div> <div>
<el-card> <el-card>
<div align="right" <div class="connection-list-top">
style="margin:10px 5px;" <div class="left-search-input-group">
width="95%"> <div class="left-search-input">
<el-button type="primary" <el-input placeholder="请输入连接名称关键字搜索"
icon="el-icon-document-add" v-model="keyword"
@click="createFormVisible=true">添加</el-button> @change="searchByKeyword"
clearable=true
style="width:300px">
</el-input>
</div>
</div>
<div class="right-add-button-group">
<el-button type="primary"
icon="el-icon-document-add"
@click="createFormVisible=true">添加</el-button>
</div>
</div> </div>
<el-table :header-cell-style="{background:'#eef1f6',color:'#606266'}" <el-table :header-cell-style="{background:'#eef1f6',color:'#606266'}"
:data="tableData" :data="tableData"
size="small" size="small"
@@ -37,21 +48,42 @@
<el-table-column label="操作" <el-table-column label="操作"
min-width="30%"> min-width="30%">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="small" <el-tooltip content="测试"
type="success" placement="top"
@click="handleMore(scope.$index, scope.row)">详情</el-button> effect="dark">
<el-button size="small" <el-button size="small"
type="warning" type="danger"
@click="handleTest(scope.$index, scope.row)">测试</el-button> icon="el-icon-document-checked"
<el-dropdown size="small" @click="handleTest(scope.$index, scope.row)"
split-button circle></el-button>
type="primary"> </el-tooltip>
更多 <el-tooltip content="详情"
<el-dropdown-menu slot="dropdown"> placement="top"
<el-dropdown-item @click.native.prevent="handleUpdate(scope.$index, scope.row)">修改</el-dropdown-item> effect="dark">
<el-dropdown-item @click.native.prevent="handleDelete(scope.$index, scope.row)">删除</el-dropdown-item> <el-button size="small"
</el-dropdown-menu> type="primary"
</el-dropdown> icon="el-icon-document"
@click="handleMore(scope.$index, scope.row)"
circle></el-button>
</el-tooltip>
<el-tooltip content="编辑"
placement="top"
effect="dark">
<el-button size="small"
type="warning"
icon="el-icon-edit"
@click="handleUpdate(scope.$index, scope.row)"
circle></el-button>
</el-tooltip>
<el-tooltip content="删除"
placement="top"
effect="dark">
<el-button size="small"
type="success"
icon="el-icon-delete"
@click="handleDelete(scope.$index, scope.row)"
circle></el-button>
</el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -296,6 +328,7 @@ export default {
data () { data () {
return { return {
loading: true, loading: true,
keyword: null,
lists: [], lists: [],
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
@@ -375,25 +408,34 @@ export default {
methods: { methods: {
loadData: function () { loadData: function () {
this.$http({ this.$http({
method: "GET", method: "POST",
url: "/dbswitch/admin/api/v1/connection/list/" + this.currentPage + "/" + this.pageSize headers: {
}).then( 'Content-Type': 'application/json'
res => {
if (0 === res.data.code) {
this.currentPage = res.data.pagination.page;
this.pageSize = res.data.pagination.size;
this.totalCount = res.data.pagination.total;
this.tableData = res.data.data;
} else {
alert("加载任务列表失败:" + res.data.message);
}
}, },
url: "/dbswitch/admin/api/v1/connection/list",
data: JSON.stringify({
searchText: this.keyword,
page: this.currentPage,
size: this.pageSize
})
}).then(res => {
if (0 === res.data.code) {
this.currentPage = res.data.pagination.page;
this.pageSize = res.data.pagination.size;
this.totalCount = res.data.pagination.total;
this.tableData = res.data.data;
} else {
alert("加载任务列表失败:" + res.data.message);
}
},
function () { function () {
console.log("failed"); console.log("load connection list failed");
} }
); );
}, },
searchByKeyword: function () {
this.loadData();
},
loadDatabaseTypes: function () { loadDatabaseTypes: function () {
this.databaseType = []; this.databaseType = [];
this.$http({ this.$http({
@@ -598,4 +640,26 @@ export default {
height: 100%; height: 100%;
overflow: auto; overflow: auto;
} }
.connection-list-top {
width: 100%;
display: flex;
justify-content: space-between;
}
.left-search-input-group {
width: calc(100% - 100px);
margin-right: auto;
display: flex;
justify-content: space-between;
}
.left-search-input {
width: 300px;
margin-right: auto;
margin: 10px 5px;
}
.right-add-button-group {
width: 100px;
margin-left: auto;
margin: 10px 5px;
}
</style> </style>

View File

@@ -1,14 +1,24 @@
<template> <template>
<div> <div>
<el-card> <el-card>
<div align="right" <div class="assignment-list-top">
style="margin:10px 5px;" <div class="left-search-input-group">
width="65%"> <div class="left-search-input">
<el-button type="primary" <el-input placeholder="请输入任务名称关键字搜索"
icon="el-icon-document-add" v-model="keyword"
size="small" clearable=true
@click="handleCreate">添加</el-button> @change="searchByKeyword"
style="width:300px">
</el-input>
</div>
</div>
<div class="right-add-button-group">
<el-button type="primary"
icon="el-icon-document-add"
@click="handleCreate">添加</el-button>
</div>
</div> </div>
<el-table :header-cell-style="{background:'#eef1f6',color:'#606266'}" <el-table :header-cell-style="{background:'#eef1f6',color:'#606266'}"
:data="tableData" :data="tableData"
size="small" size="small"
@@ -33,29 +43,38 @@
label="时间" label="时间"
min-width="15%"></el-table-column> min-width="15%"></el-table-column>
<el-table-column label="操作" <el-table-column label="操作"
min-width="40%"> min-width="30%">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="small" <el-button size="small"
type="success" type="danger"
icon="el-icon-timer"
v-if="scope.row.isPublished===false" v-if="scope.row.isPublished===false"
@click="handlePublish(scope.$index, scope.row)"><i class="el-icon-timer el-icon--right"></i>发布</el-button> @click="handlePublish(scope.$index, scope.row)"
circle>发布</el-button>
<el-button size="small" <el-button size="small"
type="warning" type="primary"
icon="el-icon-delete-location"
v-if="scope.row.isPublished===true" v-if="scope.row.isPublished===true"
@click="handleRetireTask(scope.$index, scope.row)"><i class="el-icon-delete-location el-icon--right"></i>下线</el-button> @click="handleRetireTask(scope.$index, scope.row)"
circle>下线</el-button>
<el-button size="small" <el-button size="small"
type="danger" type="danger"
icon="el-icon-video-play"
v-if="scope.row.isPublished===true" v-if="scope.row.isPublished===true"
@click="handleRunTask(scope.$index, scope.row)"><i class="el-icon-video-play el-icon--right"></i>执行</el-button> @click="handleRunTask(scope.$index, scope.row)"
<el-dropdown size="small" circle>执行</el-button>
split-button <el-button size="small"
type="primary"> type="warning"
更多 icon="el-icon-edit"
<el-dropdown-menu slot="dropdown"> v-if="scope.row.isPublished===false"
<el-dropdown-item @click.native.prevent="handleUpdate(scope.$index, scope.row)">修改</el-dropdown-item> @click="handleUpdate(scope.$index, scope.row)"
<el-dropdown-item @click.native.prevent="handleDelete(scope.$index, scope.row)">删除</el-dropdown-item> circle>修改</el-button>
</el-dropdown-menu> <el-button size="small"
</el-dropdown> type="success"
icon="el-icon-delete"
v-if="scope.row.isPublished===false"
@click="handleDelete(scope.$index, scope.row)"
circle>删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -82,30 +101,41 @@ export default {
currentPage: 1, currentPage: 1,
pageSize: 10, pageSize: 10,
totalCount: 2, totalCount: 2,
keyword: null,
tableData: [], tableData: [],
}; };
}, },
methods: { methods: {
loadData: function () { loadData: function () {
this.$http({ this.$http({
method: "GET", method: "POST",
url: "/dbswitch/admin/api/v1/assignment/list/" + this.currentPage + "/" + this.pageSize headers: {
}).then( 'Content-Type': 'application/json'
res => {
if (0 === res.data.code) {
this.currentPage = res.data.pagination.page;
this.pageSize = res.data.pagination.size;
this.totalCount = res.data.pagination.total;
this.tableData = res.data.data;
} else {
alert("加载任务列表失败:" + res.data.message);
}
}, },
url: "/dbswitch/admin/api/v1/assignment/list",
data: JSON.stringify({
searchText: this.keyword,
page: this.currentPage,
size: this.pageSize
})
}).then(res => {
if (0 === res.data.code) {
this.currentPage = res.data.pagination.page;
this.pageSize = res.data.pagination.size;
this.totalCount = res.data.pagination.total;
this.tableData = res.data.data;
} else {
alert("加载任务列表失败:" + res.data.message);
}
},
function () { function () {
console.log("failed"); console.log("load assignments list failed");
} }
); );
}, },
searchByKeyword: function () {
this.loadData();
},
boolFormatPublish (row, column) { boolFormatPublish (row, column) {
if (row.isPublished === true) { if (row.isPublished === true) {
return "是"; return "是";
@@ -256,4 +286,27 @@ export default {
color: #c0c4cc; color: #c0c4cc;
cursor: pointer; cursor: pointer;
} }
.assignment-list-top {
width: 100%;
display: flex;
justify-content: space-between;
}
.left-search-input-group {
width: calc(100% - 100px);
margin-right: auto;
display: flex;
justify-content: space-between;
}
.left-search-input {
width: 300px;
margin-right: auto;
margin: 10px 5px;
}
.right-add-button-group {
width: 100px;
margin-left: auto;
margin: 10px 5px;
}
</style> </style>

View File

@@ -44,23 +44,34 @@
value="SYSTEM_SCHEDULED"></el-option> value="SYSTEM_SCHEDULED"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="Cron表达式" <el-form-item label="执行周期"
label-width="240px" label-width="240px"
style="width:65%" style="width:65%"
v-if="createform.scheduleMode=='SYSTEM_SCHEDULED'"> v-if="createform.scheduleMode=='SYSTEM_SCHEDULED'">
<el-col :span="10"> <el-tooltip placement="top">
<el-popover v-model="cronPopover"> <div slot="content">
<vueCron @change="changeCreateCronExpression" 执行周期为CRON表达式即可以选择以下内置的周期也可以自行输入或粘贴合法的CRON表达式(最小间隔时间为2分钟)
@close="cronPopover=false" </div>
i18n="cn" /> <i class="el-icon-question"></i>
<el-input slot="reference" </el-tooltip>
:disabled=false <el-select v-model="createform.cronExpression"
v-model="createform.cronExpression" filterable
placeholder="点击选择或手动输入" allow-create>
@click="cronPopover=true" <el-option label="每5分钟执行1次"
size="small" /> value="0 0/5 * * * ? *"></el-option>
</el-popover> <el-option label="每30分钟执行1次"
</el-col> value="0 0/30 * * * ? *"></el-option>
<el-option label="每1小时执行1次"
value="0 0 0/1 * * ? *"></el-option>
<el-option label="每2小时执行1次"
value="0 0 0/2 * * ? *"></el-option>
<el-option label="每8小时执行1次"
value="0 0 0/8 * * ? *"></el-option>
<el-option label="每12小时执行1次"
value="0 0 0/12 * * ? *"></el-option>
<el-option label="每日0时执行1次"
value="0 0 0 1/1 * ? *"></el-option>
</el-select>
</el-form-item> </el-form-item>
</div> </div>
<div v-show="active == 2"> <div v-show="active == 2">
@@ -84,6 +95,7 @@
prop="sourceSchema" prop="sourceSchema"
style="width:65%"> style="width:65%">
<el-select v-model="createform.sourceSchema" <el-select v-model="createform.sourceSchema"
filterable
@change="selectCreateChangedSourceSchema" @change="selectCreateChangedSourceSchema"
placeholder="请选择"> placeholder="请选择">
<el-option v-for="(item,index) in sourceConnectionSchemas" <el-option v-for="(item,index) in sourceConnectionSchemas"
@@ -132,6 +144,7 @@
</el-tooltip> </el-tooltip>
<el-select placeholder="请选择表名" <el-select placeholder="请选择表名"
multiple multiple
filterable
v-model="createform.sourceTables"> v-model="createform.sourceTables">
<el-option v-for="(item,index) in sourceSchemaTables" <el-option v-for="(item,index) in sourceSchemaTables"
:key="index" :key="index"
@@ -161,6 +174,7 @@
prop="targetSchema" prop="targetSchema"
style="width:65%"> style="width:65%">
<el-select v-model="createform.targetSchema" <el-select v-model="createform.targetSchema"
filterable
placeholder="请选择"> placeholder="请选择">
<el-option v-for="(item,index) in targetConnectionSchemas" <el-option v-for="(item,index) in targetConnectionSchemas"
:key="index" :key="index"
@@ -210,6 +224,7 @@
</el-form-item> </el-form-item>
<el-form-item label="表名大小写转换" <el-form-item label="表名大小写转换"
label-width="240px" label-width="240px"
:required=true
prop="tableNameCase" prop="tableNameCase"
style="width:45%"> style="width:45%">
<el-tooltip placement="top"> <el-tooltip placement="top">
@@ -229,6 +244,7 @@
</el-form-item> </el-form-item>
<el-form-item label="列名大小写转换" <el-form-item label="列名大小写转换"
label-width="240px" label-width="240px"
:required=true
prop="columnNameCase" prop="columnNameCase"
style="width:45%"> style="width:45%">
<el-tooltip placement="top"> <el-tooltip placement="top">
@@ -464,7 +480,7 @@
</el-dialog> </el-dialog>
<el-dialog v-if="active == 4" <el-dialog v-if="active == 4"
title="查看字段射关系" title="查看字段射关系"
:visible.sync="columnNameMapperDialogVisible" :visible.sync="columnNameMapperDialogVisible"
:showClose="false" :showClose="false"
:before-close="handleClose"> :before-close="handleClose">

View File

@@ -6,6 +6,12 @@
<div slot="header" <div slot="header"
class="clearfix"> class="clearfix">
<span>任务安排列表</span> <span>任务安排列表</span>
<el-input placeholder="请输入关键字搜索"
v-model="keyword"
clearable=true
@change="changeSearchKeyword"
style="width:200px">
</el-input>
</div> </div>
<div class="navsBox"> <div class="navsBox">
<ul> <ul>
@@ -55,11 +61,11 @@
<el-table-column label="日志" <el-table-column label="日志"
min-width="15%"> min-width="15%">
<template slot-scope="props"> <template slot-scope="props">
<el-button size="small" <el-button size="small"
type="danger" type="danger"
@click="handleShowJobLogs(props.row.jobId)"> @click="handleShowJobLogs(props.row.jobId)">
查看 查看
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -146,6 +152,7 @@ export default {
totalCount: 0, totalCount: 0,
currentTaskAssignmentPage: 1, currentTaskAssignmentPage: 1,
currentTaskAssignmentPageSize: 10, currentTaskAssignmentPageSize: 10,
keyword: null,
pageTaskAssignments: [], pageTaskAssignments: [],
pageTaskAssignmentsTotalCount: 0, pageTaskAssignmentsTotalCount: 0,
taskId: '请选择一个任务安排', taskId: '请选择一个任务安排',
@@ -164,8 +171,16 @@ export default {
methods: { methods: {
loadPageTaskAssignments: function () { loadPageTaskAssignments: function () {
this.$http({ this.$http({
method: "GET", method: "POST",
url: "/dbswitch/admin/api/v1/assignment/list/" + this.currentTaskAssignmentPage + "/" + this.currentTaskAssignmentPageSize headers: {
'Content-Type': 'application/json'
},
url: "/dbswitch/admin/api/v1/assignment/list",
data: JSON.stringify({
searchText: this.keyword,
page: this.currentTaskAssignmentPage,
size: this.currentTaskAssignmentPageSize
})
}).then(res => { }).then(res => {
if (0 === res.data.code) { if (0 === res.data.code) {
this.pageTaskAssignments = res.data.data; this.pageTaskAssignments = res.data.data;
@@ -178,6 +193,9 @@ export default {
} }
); );
}, },
changeSearchKeyword: function () {
this.loadPageTaskAssignments();
},
handleLoadPageTaskAssignments: function (currentPage) { handleLoadPageTaskAssignments: function (currentPage) {
this.currentTaskAssignmentPage = currentPage; this.currentTaskAssignmentPage = currentPage;
this.loadPageTaskAssignments(); this.loadPageTaskAssignments();
@@ -383,5 +401,4 @@ export default {
padding: 10px; padding: 10px;
width: calc(100% - 250px); width: calc(100% - 250px);
} }
</style> </style>

View File

@@ -48,19 +48,30 @@
label-width="240px" label-width="240px"
style="width:65%" style="width:65%"
v-if="updateform.scheduleMode=='SYSTEM_SCHEDULED'"> v-if="updateform.scheduleMode=='SYSTEM_SCHEDULED'">
<el-col :span="10"> <el-tooltip placement="top">
<el-popover v-model="cronPopover"> <div slot="content">
<vueCron @change="changeUpdateCronExpression" 执行周期为CRON表达式即可以选择以下内置的周期也可以自行输入或粘贴合法的CRON表达式(最小间隔时间为2分钟)
@close="cronPopover=false" </div>
i18n="cn" /> <i class="el-icon-question"></i>
<el-input slot="reference" </el-tooltip>
:disabled=false <el-select v-model="updateform.cronExpression"
v-model="updateform.cronExpression" filterable
placeholder="点击选择或手动输入" allow-create>
@click="cronPopover=true" <el-option label="每5分钟执行1次"
size="small" /> value="0 0/5 * * * ? *"></el-option>
</el-popover> <el-option label="每30分钟执行1次"
</el-col> value="0 0/30 * * * ? *"></el-option>
<el-option label="每1小时执行1次"
value="0 0 0/1 * * ? *"></el-option>
<el-option label="每2小时执行1次"
value="0 0 0/2 * * ? *"></el-option>
<el-option label="每8小时执行1次"
value="0 0 0/8 * * ? *"></el-option>
<el-option label="每12小时执行1次"
value="0 0 0/12 * * ? *"></el-option>
<el-option label="每日0时执行1次"
value="0 0 0 1/1 * ? *"></el-option>
</el-select>
</el-form-item> </el-form-item>
</div> </div>
<div v-show="active == 2"> <div v-show="active == 2">
@@ -84,6 +95,7 @@
prop="sourceSchema" prop="sourceSchema"
style="width:65%"> style="width:65%">
<el-select v-model="updateform.sourceSchema" <el-select v-model="updateform.sourceSchema"
filterable
@change="selectUpdateChangedSourceSchema" @change="selectUpdateChangedSourceSchema"
placeholder="请选择"> placeholder="请选择">
<el-option v-for="(item,index) in sourceConnectionSchemas" <el-option v-for="(item,index) in sourceConnectionSchemas"
@@ -132,6 +144,7 @@
</el-tooltip> </el-tooltip>
<el-select placeholder="请选择表名" <el-select placeholder="请选择表名"
multiple multiple
filterable
v-model="updateform.sourceTables"> v-model="updateform.sourceTables">
<el-option v-for="(item,index) in sourceSchemaTables" <el-option v-for="(item,index) in sourceSchemaTables"
:key="index" :key="index"
@@ -186,6 +199,26 @@
:value=false></el-option> :value=false></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label-width="240px"
:required=true
prop="targetDropTable"
style="width:65%">
<span slot="label">
<span style="color: red"><strong>删除同名表</strong> </span>
</span>
<el-tooltip placement="top">
<div slot="content">
当目标端存在同名表时,如果配置为“是”,则会删除同步表后再进行创建。如果修改了表或字段的映射关系,请将配置为“是”,否则任务执行时会因映射关系不匹配而报错。
</div>
<i class="el-icon-question"></i>
</el-tooltip>
<el-select v-model="updateform.targetDropTable">
<el-option label='是'
:value=true></el-option>
<el-option label='否'
:value=false></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据处理批次大小" <el-form-item label="数据处理批次大小"
label-width="240px" label-width="240px"
:required=true :required=true
@@ -210,6 +243,7 @@
</el-form-item> </el-form-item>
<el-form-item label="表名大小写转换" <el-form-item label="表名大小写转换"
label-width="240px" label-width="240px"
:required=true
prop="tableNameCase" prop="tableNameCase"
style="width:45%"> style="width:45%">
<el-tooltip placement="top"> <el-tooltip placement="top">
@@ -229,6 +263,7 @@
</el-form-item> </el-form-item>
<el-form-item label="列名大小写转换" <el-form-item label="列名大小写转换"
label-width="240px" label-width="240px"
:required=true
prop="columnNameCase" prop="columnNameCase"
style="width:45%"> style="width:45%">
<el-tooltip placement="top"> <el-tooltip placement="top">
@@ -366,6 +401,7 @@
<el-descriptions-item label="目地端数据源">[{{updateform.targetConnectionId}}]{{targetConnection.name}}</el-descriptions-item> <el-descriptions-item label="目地端数据源">[{{updateform.targetConnectionId}}]{{targetConnection.name}}</el-descriptions-item>
<el-descriptions-item label="目地端schema">{{updateform.targetSchema}}</el-descriptions-item> <el-descriptions-item label="目地端schema">{{updateform.targetSchema}}</el-descriptions-item>
<el-descriptions-item label="只创建表">{{updateform.targetOnlyCreate}}</el-descriptions-item> <el-descriptions-item label="只创建表">{{updateform.targetOnlyCreate}}</el-descriptions-item>
<el-descriptions-item label="删除同名表">{{updateform.targetDropTable}}</el-descriptions-item>
<el-descriptions-item label="数据处理批次量">{{updateform.batchSize}}</el-descriptions-item> <el-descriptions-item label="数据处理批次量">{{updateform.batchSize}}</el-descriptions-item>
<el-descriptions-item label="表名大小写转换"> <el-descriptions-item label="表名大小写转换">
<span v-if="updateform.tableNameCase == 'NONE'"> <span v-if="updateform.tableNameCase == 'NONE'">
@@ -469,7 +505,7 @@
</el-dialog> </el-dialog>
<el-dialog v-if="active == 4" <el-dialog v-if="active == 4"
title="查看字段射关系" title="查看字段射关系"
:visible.sync="columnNameMapperDialogVisible" :visible.sync="columnNameMapperDialogVisible"
:showClose="false" :showClose="false"
:before-close="handleClose"> :before-close="handleClose">
@@ -948,7 +984,7 @@ export default {
columnNameMapper: this.updateform.columnNameMapper, columnNameMapper: this.updateform.columnNameMapper,
tableNameCase: this.updateform.tableNameCase, tableNameCase: this.updateform.tableNameCase,
columnNameCase: this.updateform.columnNameCase, columnNameCase: this.updateform.columnNameCase,
targetDropTable: true, targetDropTable: this.updateform.targetDropTable,
targetOnlyCreate: this.updateform.targetOnlyCreate, targetOnlyCreate: this.updateform.targetOnlyCreate,
batchSize: this.updateform.batchSize batchSize: this.updateform.batchSize
} }

View File

@@ -51,6 +51,7 @@ public class AssignmentDetailConverter extends
config.setTargetConnectionName(dstConn.getName()); config.setTargetConnectionName(dstConn.getName());
config.setTargetSchema(taskConfig.getTargetSchema()); config.setTargetSchema(taskConfig.getTargetSchema());
config.setTargetOnlyCreate(taskConfig.getTargetOnlyCreate()); config.setTargetOnlyCreate(taskConfig.getTargetOnlyCreate());
config.setTargetDropTable(taskConfig.getTargetDropTable());
config.setTableNameCase(taskConfig.getTableNameCase()); config.setTableNameCase(taskConfig.getTableNameCase());
config.setColumnNameCase(taskConfig.getColumnNameCase()); config.setColumnNameCase(taskConfig.getColumnNameCase());
config.setTableNameMapper(taskConfig.getTableNameMap()); config.setTableNameMapper(taskConfig.getTableNameMap());

View File

@@ -16,6 +16,7 @@ import com.gitee.dbswitch.admin.common.response.Result;
import com.gitee.dbswitch.admin.config.SwaggerConfig; import com.gitee.dbswitch.admin.config.SwaggerConfig;
import com.gitee.dbswitch.admin.model.request.AssigmentCreateRequest; import com.gitee.dbswitch.admin.model.request.AssigmentCreateRequest;
import com.gitee.dbswitch.admin.model.request.AssigmentUpdateRequest; import com.gitee.dbswitch.admin.model.request.AssigmentUpdateRequest;
import com.gitee.dbswitch.admin.model.request.AssignmentSearchRequest;
import com.gitee.dbswitch.admin.model.response.AssignmentDetailResponse; import com.gitee.dbswitch.admin.model.response.AssignmentDetailResponse;
import com.gitee.dbswitch.admin.model.response.AssignmentInfoResponse; import com.gitee.dbswitch.admin.model.response.AssignmentInfoResponse;
import com.gitee.dbswitch.admin.service.AssignmentService; import com.gitee.dbswitch.admin.service.AssignmentService;
@@ -70,11 +71,9 @@ public class AssignmentController {
@TokenCheck @TokenCheck
@ApiOperation(value = "任务列表") @ApiOperation(value = "任务列表")
@GetMapping(value = "/list/{page}/{size}", produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
public PageResult<AssignmentInfoResponse> listAssignment( public PageResult<AssignmentInfoResponse> listAssignment(@RequestBody AssignmentSearchRequest request) {
@PathVariable("page") Integer page, return assignmentService.listAll(request);
@PathVariable("size") Integer size) {
return assignmentService.listAll(null, page, size);
} }
@TokenCheck @TokenCheck

View File

@@ -58,11 +58,9 @@ public class ConnectionController {
@TokenCheck @TokenCheck
@ApiOperation(value = "连接列表") @ApiOperation(value = "连接列表")
@GetMapping(value = "/list/{page}/{size}", produces = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "/list", produces = MediaType.APPLICATION_JSON_VALUE)
public PageResult<DbConnectionDetailResponse> getConnections(DbConnectionSearchRequest request, public PageResult<DbConnectionDetailResponse> getConnections(@RequestBody DbConnectionSearchRequest request) {
@PathVariable(value = "page", required = false) Integer page, return connectionService.getConnections(request);
@PathVariable(value = "size", required = false) Integer size) {
return connectionService.getConnections(request, page, size);
} }
@TokenCheck @TokenCheck

View File

@@ -0,0 +1,22 @@
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/dbswitch
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2020/1/2
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.dbswitch.admin.model.request;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class AssignmentSearchRequest {
private String searchText;
private Integer page;
private Integer size;
}

View File

@@ -17,4 +17,6 @@ import lombok.NoArgsConstructor;
public class DbConnectionSearchRequest { public class DbConnectionSearchRequest {
private String searchText; private String searchText;
private Integer page;
private Integer size;
} }

View File

@@ -91,6 +91,9 @@ public class AssignmentDetailResponse {
@ApiModelProperty("是否只建表") @ApiModelProperty("是否只建表")
private Boolean targetOnlyCreate; private Boolean targetOnlyCreate;
@ApiModelProperty("是否删除同名表")
private Boolean targetDropTable;
@ApiModelProperty("表名大小写配置") @ApiModelProperty("表名大小写配置")
private CaseConvertEnum tableNameCase; private CaseConvertEnum tableNameCase;

View File

@@ -23,6 +23,7 @@ import com.gitee.dbswitch.admin.entity.AssignmentTaskEntity;
import com.gitee.dbswitch.admin.entity.DatabaseConnectionEntity; import com.gitee.dbswitch.admin.entity.DatabaseConnectionEntity;
import com.gitee.dbswitch.admin.model.request.AssigmentCreateRequest; import com.gitee.dbswitch.admin.model.request.AssigmentCreateRequest;
import com.gitee.dbswitch.admin.model.request.AssigmentUpdateRequest; import com.gitee.dbswitch.admin.model.request.AssigmentUpdateRequest;
import com.gitee.dbswitch.admin.model.request.AssignmentSearchRequest;
import com.gitee.dbswitch.admin.model.response.AssignmentDetailResponse; import com.gitee.dbswitch.admin.model.response.AssignmentDetailResponse;
import com.gitee.dbswitch.admin.model.response.AssignmentInfoResponse; import com.gitee.dbswitch.admin.model.response.AssignmentInfoResponse;
import com.gitee.dbswitch.admin.type.ScheduleModeEnum; import com.gitee.dbswitch.admin.type.ScheduleModeEnum;
@@ -116,12 +117,12 @@ public class AssignmentService {
} }
} }
public PageResult<AssignmentInfoResponse> listAll(String searchText, Integer page, Integer size) { public PageResult<AssignmentInfoResponse> listAll(AssignmentSearchRequest request) {
Supplier<List<AssignmentInfoResponse>> method = () -> Supplier<List<AssignmentInfoResponse>> method = () ->
ConverterFactory.getConverter(AssignmentInfoConverter.class) ConverterFactory.getConverter(AssignmentInfoConverter.class)
.convert(assignmentTaskDAO.listAll(searchText)); .convert(assignmentTaskDAO.listAll(request.getSearchText()));
return PageUtils.getPage(method, page, size); return PageUtils.getPage(method, request.getPage(), request.getSize());
} }
public Result<AssignmentDetailResponse> detailAssignment(Long id) { public Result<AssignmentDetailResponse> detailAssignment(Long id) {

View File

@@ -120,8 +120,7 @@ public class ConnectionService {
} }
public PageResult<DbConnectionDetailResponse> getConnections( public PageResult<DbConnectionDetailResponse> getConnections(
DbConnectionSearchRequest request, DbConnectionSearchRequest request) {
Integer page, Integer size) {
Supplier<List<DbConnectionDetailResponse>> method = () -> { Supplier<List<DbConnectionDetailResponse>> method = () -> {
List<DatabaseConnectionEntity> databaseConnectionEntities = databaseConnectionDAO List<DatabaseConnectionEntity> databaseConnectionEntities = databaseConnectionDAO
.listAll(request.getSearchText()); .listAll(request.getSearchText());
@@ -129,7 +128,7 @@ public class ConnectionService {
.convert(databaseConnectionEntities); .convert(databaseConnectionEntities);
}; };
return PageUtils.getPage(method, page, size); return PageUtils.getPage(method, request.getPage(), request.getSize());
} }
public DbConnectionDetailResponse getDetailById(Long id) { public DbConnectionDetailResponse getDetailById(Long id) {

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.d32de86bf73d91875b8703ccf4df784b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.77cf875651e80e93b9d5.js></script><script type=text/javascript src=/static/js/vendor.a3e6dafc4ec8793dd626.js></script><script type=text/javascript src=/static/js/app.a7a6316fe14fe86c7a6f.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.9dc9b6fb7573c2e9456fa7a832cf0a9a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.0fda45902a101132fbc2.js></script><script type=text/javascript src=/static/js/vendor.a3e6dafc4ec8793dd626.js></script><script type=text/javascript src=/static/js/app.40072d5dbf0657cecde3.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

View File

@@ -0,0 +1,2 @@
webpackJsonp([10],{WfA7:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a={data:function(){return{dialogVisible:!1,loading:!0,connectionTypes:[],versionDrivers:[],isActive:-1}},methods:{loadConnectionTypes:function(){var t=this;this.$http({method:"GET",url:"/dbswitch/admin/api/v1/connection/types"}).then(function(e){0===e.data.code?(t.connectionTypes=e.data.data,t.handleChooseClick("MYSQL",0)):e.data.message&&alert("初始化数据库类型信息失败:"+e.data.message)})},handleChooseClick:function(t,e){var i=this;this.isActive=e,this.$http.get("/dbswitch/admin/api/v1/connection/"+t+"/drivers").then(function(t){0===t.data.code?i.versionDrivers=t.data.data:t.data.message&&alert("查询驱动版本信息失败,"+t.data.message)})},handleClose:function(t){this.$confirm("确认关闭?").then(function(e){t()}).catch(function(t){})},formatJarFileList:function(t,e){return t[e.property].join(";\n")}},created:function(){this.loadConnectionTypes()},beforeDestroy:function(){}},n={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("el-card",[i("div",{staticClass:"container"},[i("el-card",{staticClass:"box-card"},[i("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[i("span",[t._v("数据库类型列表")])]),t._v(" "),i("div",{staticClass:"navsBox"},[i("ul",t._l(t.connectionTypes,function(e,a){return i("li",{key:a,class:{active:a==t.isActive},on:{click:function(i){return t.handleChooseClick(e.type,a)}}},[t._v("["+t._s(e.id)+"]"+t._s(e.type))])}),0)])]),t._v(" "),i("div",{staticClass:"contentBox"},[i("div",{staticStyle:{margin:"10px 5px"},attrs:{align:"right",width:"95%"}},[i("el-button",{attrs:{type:"primary",icon:"el-icon-document-add"},on:{click:function(e){t.dialogVisible=!0}}},[t._v("添加驱动")])],1),t._v(" "),i("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.versionDrivers,size:"small",stripe:"",border:""}},[i("template",{slot:"empty"},[i("span",[t._v("单击左侧数据库类型来查看对应的驱动版本信息")])]),t._v(" "),i("el-table-column",{attrs:{property:"driverVersion",label:"驱动版本号","min-width":"15%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverClass",label:"驱动类名","min-width":"20%"}}),t._v(" "),i("el-table-column",{attrs:{property:"jarFiles",formatter:t.formatJarFileList,label:"驱动JAR名称","min-width":"30%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverPath",label:"驱动版本路径","min-width":"50%"}})],2)],1)],1)]),t._v(" "),i("el-dialog",{attrs:{title:"添加数据库驱动JAR说明",visible:t.dialogVisible,width:"40%","before-close":t.handleClose},on:{"update:visible":function(e){t.dialogVisible=e}}},[i("span",[t._v("请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下在数据库类型为名称的目录下以驱动版本号为名称创建目录并放置对应的驱动jar文件然后重启即可生效。具体可参考https://gitee.com/inrgihc/dbswitch/tree/master/drivers下的目录结构。")]),t._v(" "),i("span"),t._v(" "),i("span",[t._v("特殊说明驱动版本目录下的所有JAR必须无任何外部依赖否则也需将其依赖JAR一起放置到对应的目录下。")]),t._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(e){t.dialogVisible=!1}}},[t._v("取 消")]),t._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(e){t.dialogVisible=!1}}},[t._v("确 定")])],1)])],1)},staticRenderFns:[]};var s=i("VU/8")(a,n,!1,function(t){i("ZwLs")},"data-v-de622598",null);e.default=s.exports},ZwLs:function(t,e){}});
//# sourceMappingURL=10.52c9cb61b5477d06570b.js.map

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:{"header-cell-style":{background:"#eef1f6",color:"#606266"},"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("3GnV")},"data-v-aee4e92e",null);t.default=n.exports},"3GnV":function(e,t){}}); webpackJsonp([12],{"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:{"header-cell-style":{background:"#eef1f6",color:"#606266"},"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("3GnV")},"data-v-aee4e92e",null);t.default=n.exports},"3GnV":function(e,t){}});
//# sourceMappingURL=11.c61c0ebee350b7e0cba3.js.map //# sourceMappingURL=12.e325228628d3c50a96e7.js.map

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([14],{WfA7:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a={data:function(){return{dialogVisible:!1,loading:!0,connectionTypes:[],versionDrivers:[],isActive:-1}},methods:{loadConnectionTypes:function(){var t=this;this.$http({method:"GET",url:"/dbswitch/admin/api/v1/connection/types"}).then(function(e){0===e.data.code?t.connectionTypes=e.data.data:e.data.message&&alert("初始化数据库类型信息失败:"+e.data.message)})},handleChooseClick:function(t,e){var i=this;this.isActive=e,this.$http.get("/dbswitch/admin/api/v1/connection/"+t+"/drivers").then(function(t){0===t.data.code?i.versionDrivers=t.data.data:t.data.message&&alert("查询驱动版本信息失败,"+t.data.message)})},handleClose:function(t){this.$confirm("确认关闭?").then(function(e){t()}).catch(function(t){})},formatJarFileList:function(t,e){return t[e.property].join(";\n")}},created:function(){this.loadConnectionTypes()},beforeDestroy:function(){}},n={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("el-card",[i("div",{staticClass:"container"},[i("el-card",{staticClass:"box-card"},[i("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[i("span",[t._v("数据库类型列表")])]),t._v(" "),i("div",{staticClass:"navsBox"},[i("ul",t._l(t.connectionTypes,function(e,a){return i("li",{key:a,class:{active:a==t.isActive},on:{click:function(i){return t.handleChooseClick(e.type,a)}}},[t._v("["+t._s(e.id)+"]"+t._s(e.type))])}),0)])]),t._v(" "),i("div",{staticClass:"contentBox"},[i("div",{staticStyle:{margin:"10px 5px"},attrs:{align:"right",width:"95%"}},[i("el-button",{attrs:{type:"primary",icon:"el-icon-document-add"},on:{click:function(e){t.dialogVisible=!0}}},[t._v("添加驱动")])],1),t._v(" "),i("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.versionDrivers,size:"small",stripe:"",border:""}},[i("template",{slot:"empty"},[i("span",[t._v("单击左侧数据库类型来查看对应的驱动版本信息")])]),t._v(" "),i("el-table-column",{attrs:{property:"driverVersion",label:"驱动版本号","min-width":"15%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverClass",label:"驱动类名","min-width":"20%"}}),t._v(" "),i("el-table-column",{attrs:{property:"jarFiles",formatter:t.formatJarFileList,label:"驱动JAR名称","min-width":"30%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverPath",label:"驱动版本路径","min-width":"50%"}})],2)],1)],1)]),t._v(" "),i("el-dialog",{attrs:{title:"添加数据库驱动JAR说明",visible:t.dialogVisible,width:"40%","before-close":t.handleClose},on:{"update:visible":function(e){t.dialogVisible=e}}},[i("span",[t._v("请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下在数据库类型为名称的目录下以驱动版本号为名称创建目录并放置对应的驱动jar文件然后重启即可生效。具体可参考https://gitee.com/inrgihc/dbswitch/tree/master/drivers下的目录结构。")]),t._v(" "),i("span"),t._v(" "),i("span",[t._v("特殊说明驱动版本目录下的所有JAR必须无任何外部依赖否则也需将其依赖JAR一起放置到对应的目录下。")]),t._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(e){t.dialogVisible=!1}}},[t._v("取 消")]),t._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(e){t.dialogVisible=!1}}},[t._v("确 定")])],1)])],1)},staticRenderFns:[]};var s=i("VU/8")(a,n,!1,function(t){i("g7vK")},"data-v-5f908938",null);e.default=s.exports},g7vK:function(t,e){}});
//# sourceMappingURL=14.cf28f7dc3d2e1f1276e9.js.map

View File

@@ -1,2 +1,2 @@
webpackJsonp([12],{oQRv:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={data:function(){return{loading:!0,lists:[],currentPage:1,pageSize:10,totalCount:0}},methods:{loadData:function(){var t=this;this.$http.get("/dbswitch/admin/api/v1/syslog/list/1/"+this.currentPage+"/"+this.pageSize).then(function(e){t.loading=!1,0===e.data.code?(t.currentPage=e.data.pagination.page,t.pageSize=e.data.pagination.size,t.totalCount=e.data.pagination.total,t.lists=e.data.data):alert("加载数据失败:"+e.data.message)},function(e){t.$message({showClose:!0,message:"数据加载错误",type:"error"})})},handleSizeChange:function(t){this.loading=!0,this.pageSize=t,this.loadData()},handleCurrentChange:function(t){this.loading=!0,this.currentPage=t,this.loadData()}},created:function(){this.loadData()}},i={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{"margin-top":"15px"}},[a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},"element-loading-text":"拼命加载中","element-loading-spinner":"el-icon-loading","element-loading-background":"rgba(0, 0, 0, 0.8)",data:t.lists,stripe:"",size:"small",border:""}},[a("el-table-column",{attrs:{prop:"createTime",label:"日志时间","min-width":"15%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"ipAddress",label:"请求IP","min-width":"10%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"content",label:"操作内容","min-width":"20%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"userAgent",label:"请求代理","min-width":"50%","show-overflow-tooltip":!0}})],1),t._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("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)},staticRenderFns:[]};var o=a("VU/8")(n,i,!1,function(t){a("rPsM")},"data-v-86686ab2",null);e.default=o.exports},rPsM:function(t,e){}}); webpackJsonp([14],{oQRv:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n={data:function(){return{loading:!0,lists:[],currentPage:1,pageSize:10,totalCount:0}},methods:{loadData:function(){var t=this;this.$http.get("/dbswitch/admin/api/v1/syslog/list/1/"+this.currentPage+"/"+this.pageSize).then(function(e){t.loading=!1,0===e.data.code?(t.currentPage=e.data.pagination.page,t.pageSize=e.data.pagination.size,t.totalCount=e.data.pagination.total,t.lists=e.data.data):alert("加载数据失败:"+e.data.message)},function(e){t.$message({showClose:!0,message:"数据加载错误",type:"error"})})},handleSizeChange:function(t){this.loading=!0,this.pageSize=t,this.loadData()},handleCurrentChange:function(t){this.loading=!0,this.currentPage=t,this.loadData()}},created:function(){this.loadData()}},i={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticStyle:{"margin-top":"15px"}},[a("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],staticStyle:{width:"100%"},attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},"element-loading-text":"拼命加载中","element-loading-spinner":"el-icon-loading","element-loading-background":"rgba(0, 0, 0, 0.8)",data:t.lists,stripe:"",size:"small",border:""}},[a("el-table-column",{attrs:{prop:"createTime",label:"日志时间","min-width":"15%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"ipAddress",label:"请求IP","min-width":"10%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"content",label:"操作内容","min-width":"20%","show-overflow-tooltip":!0}}),t._v(" "),a("el-table-column",{attrs:{prop:"userAgent",label:"请求代理","min-width":"50%","show-overflow-tooltip":!0}})],1),t._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("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)},staticRenderFns:[]};var o=a("VU/8")(n,i,!1,function(t){a("rPsM")},"data-v-86686ab2",null);e.default=o.exports},rPsM:function(t,e){}});
//# sourceMappingURL=12.e59d78e330bd5e2703c1.js.map //# sourceMappingURL=14.ebafac48d154df9f8737.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

View File

@@ -0,0 +1,2 @@
webpackJsonp([19],{NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),c=t("7+uW"),a={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var i=t("VU/8")({name:"App"},a,!1,function(n){t("Pibb")},"data-v-a97617c2",null).exports,u=t("/ocq");c.default.use(u.a);var l=new u.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(9)]).then(t.bind(null,"ARoL"))}},{path:"/connection",name:"连接配置",icon:"el-icon-s-order",component:function(){return t.e(8).then(t.bind(null,"Hoc+"))},children:[{path:"/connection/driver",name:"驱动配置",icon:"el-icon-help",component:function(){return t.e(10).then(t.bind(null,"WfA7"))}},{path:"/connection/list",name:"连接管理",icon:"el-icon-bank-card",component:function(){return Promise.all([t.e(0),t.e(15)]).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(13)]).then(t.bind(null,"D0I9"))}},{path:"/task/schedule",name:"调度记录",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(11)]).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-place",component:function(){return t.e(14).then(t.bind(null,"oQRv"))}},{path:"/log/action",name:"操作日志",icon:"el-icon-s-check",component:function(){return t.e(12).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(17)]).then(t.bind(null,"/rCC"))}},{path:"/task/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(16)]).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);c.default.use(d),c.default.use(h.a),c.default.use(b.a),c.default.prototype.$http=d,c.default.config.productionTip=!1,c.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 c.default({el:"#app",router:l,components:{App:i},template:"<App/>"})},Pibb:function(n,e){},muQq:function(n,e){},tvR6:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.40072d5dbf0657cecde3.js.map

View File

@@ -1,2 +0,0 @@
webpackJsonp([19],{NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),c=t("7+uW"),a={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var i=t("VU/8")({name:"App"},a,!1,function(n){t("Pibb")},"data-v-a97617c2",null).exports,u=t("/ocq");c.default.use(u.a);var l=new u.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(9)]).then(t.bind(null,"ARoL"))}},{path:"/connection",name:"连接配置",icon:"el-icon-s-order",component:function(){return t.e(8).then(t.bind(null,"Hoc+"))},children:[{path:"/connection/driver",name:"驱动配置",icon:"el-icon-help",component:function(){return t.e(14).then(t.bind(null,"WfA7"))}},{path:"/connection/list",name:"连接管理",icon:"el-icon-bank-card",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(16)]).then(t.bind(null,"D0I9"))}},{path:"/task/schedule",name:"调度记录",icon:"el-icon-pie-chart",component:function(){return t.e(17).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-place",component:function(){return t.e(12).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(13)]).then(t.bind(null,"/rCC"))}},{path:"/task/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"txod"))}}]},{path:"/login",name:"登录",component:function(){return t.e(5).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),d=t.n(p).a.create();d.interceptors.request.use(function(n){return n.url=""+n.url,n});var s=d,h=t("zL8q"),m=t.n(h),f=(t("muQq"),t("tvR6"),t("7Vno")),b=t.n(f),v=t("XLwt"),g=t.n(v);c.default.use(s),c.default.use(m.a),c.default.use(b.a),c.default.prototype.$http=s,c.default.config.productionTip=!1,c.default.prototype.$echarts=g.a,s.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)}),s.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 c.default({el:"#app",router:l,components:{App:i},template:"<App/>"})},Pibb:function(n,e){},muQq:function(n,e){},tvR6:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.a7a6316fe14fe86c7a6f.js.map

View File

@@ -0,0 +1,2 @@
!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={20: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:"d0db995e4146b5e72cf1",2:"5d584a7e3f04041f0d4a",3:"d4c1dc7b68edb49b61d2",4:"c4abd62fbe15189d37a5",5:"837a4a67f1fcf6ee6c6a",6:"7f56c2238fb7e4ee2ecd",7:"d5dc80a855f66a3208ff",8:"0b82703c6f3d2dd72354",9:"9b19245845e7fa49300a",10:"52c9cb61b5477d06570b",11:"4f4f786a1368f729ad67",12:"e325228628d3c50a96e7",13:"e070a44a625afa974861",14:"ebafac48d154df9f8737",15:"29f439cdda1d78880f9c",16:"8aeafd6e382957be1c15",17:"830d0c7cf66ae4ca86c3"}[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.0fda45902a101132fbc2.js.map

View File

@@ -1,2 +0,0 @@
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var f,d,i,u=0,b=[];u<r.length;u++)d=r[u],t[d]&&b.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,a);b.length;)b.shift()();if(a)for(u=0;u<a.length;u++)i=c(c.s=a[u]);return i};var r={},t={20:0};function c(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,c),t.l=!0,t.exports}c.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,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"ca67e87d8c000a42e592",1:"d0db995e4146b5e72cf1",2:"e8530496bfc5633541cd",3:"d4c1dc7b68edb49b61d2",4:"c4abd62fbe15189d37a5",5:"837a4a67f1fcf6ee6c6a",6:"7f56c2238fb7e4ee2ecd",7:"d5dc80a855f66a3208ff",8:"0b82703c6f3d2dd72354",9:"9b19245845e7fa49300a",10:"b9e09bc05c7d8239e93b",11:"c61c0ebee350b7e0cba3",12:"e59d78e330bd5e2703c1",13:"1a23a103b05b99d58001",14:"cf28f7dc3d2e1f1276e9",15:"c8f8271138d0a2e8e5cc",16:"aeaac7f46732356168a8",17:"953b93ad4217ddda621f"}[e]+".js";var f=setTimeout(d,12e4);function d(){a.onerror=a.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=d,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.77cf875651e80e93b9d5.js.map