From 2fd2d1d25bcbd8e60df5dbd445f93dae876133d3 Mon Sep 17 00:00:00 2001 From: odjbin <1042039504@qq.com> Date: Mon, 1 Jul 2024 18:56:16 +0800 Subject: [PATCH] =?UTF-8?q?fix=20:=20=E8=B0=83=E6=95=B4=E5=A4=B4=E9=83=A8i?= =?UTF-8?q?con,=E5=88=A0=E9=99=A4=E6=B2=A1=E7=94=A8=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/favicon.ico | Bin 4286 -> 65100 bytes src/api/custom-query/adapter.js | 61 - src/api/custom-query/datamodel.js | 66 - src/api/custom-query/echarts.js | 36 - src/api/custom-query/query-page.js | 22 - src/api/custom-query/sql-search.js | 37 - src/api/custom-query/sql.js | 42 - src/api/custom-query/table.js | 70 - src/api/custom-query/topo-search.js | 47 - src/api/custom-query/topo.js | 42 - src/router/index.js | 54 - .../data-adapter/DataAdapterDesign.vue | 71 - src/views/custom-query/data-adapter/index.vue | 285 --- src/views/custom-query/datamodel/index.vue | 392 ---- .../echarts-editor/EchartsDesign.vue | 233 --- .../echarts-editor/components/AxisBox.vue | 538 ----- .../components/ChartsOptions.vue | 307 --- .../components/EchartsEditor.vue | 307 --- .../components/barChart/AdvancedSettings.vue | 86 - .../components/barChart/BasicSetting.vue | 140 -- .../components/lineChart/AdvancedSettings.vue | 86 - .../components/lineChart/BasicSetting.vue | 160 -- .../components/pieChart/BasicSetting.vue | 17 - .../components/pieChart/PieBox.vue | 116 -- .../components/radarChart/RadarBox.vue | 110 - .../custom-query/echarts-editor/index.vue | 233 --- src/views/custom-query/query-page/index.vue | 107 - src/views/custom-query/sql/SqlDesign.vue | 486 ----- src/views/custom-query/sql/index.vue | 351 ---- .../table-management/editTable.vue | 316 --- .../table-management/importTable.vue | 201 -- .../custom-query/table-management/index.vue | 249 --- .../components/changeImage/ChangeImage.vue | 37 - .../changeImage/SettingImageDialog.vue | 62 - src/views/custom-query/topo/index.vue | 352 ---- .../topo/top/behavior/click-er-edge.js | 81 - .../topo/top/behavior/click-er-node.js | 157 -- .../topo/top/behavior/drag-add-edge.js | 232 --- .../topo/top/behavior/drag-event-edit.js | 57 - .../topo/top/behavior/hover-event-edit.js | 66 - .../custom-query/topo/top/behavior/index.js | 30 - .../topo/top/behavior/keyup-event-edit.js | 67 - .../topo/top/components/FooterBar.vue | 91 - .../topo/top/components/HeaderBar.vue | 91 - .../custom-query/topo/top/config/edge.js | 13 - .../custom-query/topo/top/config/index.js | 11 - src/views/custom-query/topo/top/edge/base.js | 30 - src/views/custom-query/topo/top/edge/index.js | 18 - .../custom-query/topo/top/edge/top-cubic.js | 14 - .../custom-query/topo/top/elements/button.vue | 92 - .../topo/top/elements/checkbox.vue | 75 - .../topo/top/elements/dropdown.vue | 75 - .../custom-query/topo/top/elements/index.js | 17 - .../topo/top/elements/loading.vue | 91 - .../custom-query/topo/top/graph/index.js | 162 -- src/views/custom-query/topo/top/index.vue | 12 - .../custom-query/topo/top/node/dice-er-box.js | 302 --- src/views/custom-query/topo/top/node/index.js | 20 - .../custom-query/topo/top/theme/dark-style.js | 177 -- .../topo/top/theme/default-style.js | 179 -- .../custom-query/topo/top/theme/index.js | 15 - .../topo/top/theme/office-style.js | 177 -- .../custom-query/topo/top/toolbar-edit.vue | 217 -- .../custom-query/topo/top/toolbar-preview.vue | 183 -- src/views/custom-query/topo/top/topology.vue | 1808 ----------------- .../custom-query/topo/topologyDesign.vue | 312 --- .../topo/utils/anchor/draw_mark.js | 56 - .../custom-query/topo/utils/anchor/index.js | 13 - .../topo/utils/anchor/set-state.js | 25 - .../custom-query/topo/utils/anchor/update.js | 31 - .../custom-query/topo/utils/collapse/index.js | 11 - .../topo/utils/collapse/set-state.js | 32 - src/views/custom-query/topo/utils/date.js | 106 - .../custom-query/topo/utils/edge/index.js | 11 - .../custom-query/topo/utils/edge/set-state.js | 20 - src/views/custom-query/topo/utils/index.js | 117 -- .../custom-query/topo/utils/node/index.js | 11 - .../custom-query/topo/utils/node/set-state.js | 26 - src/views/rapid/gen/basicInfoForm.vue | 67 - src/views/rapid/gen/editTable.vue | 234 --- src/views/rapid/gen/importTable.vue | 185 -- src/views/rapid/gen/index.vue | 362 ---- src/views/rapid/gen/tableInfo.vue | 210 -- src/views/rapid/regular/index.vue | 302 --- src/views/rapid/source/index.vue | 380 ---- src/views/steps/step/Step1.vue | 17 - src/views/steps/step/Step2.vue | 17 - src/views/steps/step/Step3.vue | 17 - src/views/steps/step/Step4.vue | 17 - src/views/steps/step/Step5.vue | 17 - src/views/steps/step/index.vue | 39 - 91 files changed, 12914 deletions(-) delete mode 100644 src/api/custom-query/adapter.js delete mode 100644 src/api/custom-query/datamodel.js delete mode 100644 src/api/custom-query/echarts.js delete mode 100644 src/api/custom-query/query-page.js delete mode 100644 src/api/custom-query/sql-search.js delete mode 100644 src/api/custom-query/sql.js delete mode 100644 src/api/custom-query/table.js delete mode 100644 src/api/custom-query/topo-search.js delete mode 100644 src/api/custom-query/topo.js delete mode 100644 src/views/custom-query/data-adapter/DataAdapterDesign.vue delete mode 100644 src/views/custom-query/data-adapter/index.vue delete mode 100644 src/views/custom-query/datamodel/index.vue delete mode 100644 src/views/custom-query/echarts-editor/EchartsDesign.vue delete mode 100644 src/views/custom-query/echarts-editor/components/AxisBox.vue delete mode 100644 src/views/custom-query/echarts-editor/components/ChartsOptions.vue delete mode 100644 src/views/custom-query/echarts-editor/components/EchartsEditor.vue delete mode 100644 src/views/custom-query/echarts-editor/components/barChart/AdvancedSettings.vue delete mode 100644 src/views/custom-query/echarts-editor/components/barChart/BasicSetting.vue delete mode 100644 src/views/custom-query/echarts-editor/components/lineChart/AdvancedSettings.vue delete mode 100644 src/views/custom-query/echarts-editor/components/lineChart/BasicSetting.vue delete mode 100644 src/views/custom-query/echarts-editor/components/pieChart/BasicSetting.vue delete mode 100644 src/views/custom-query/echarts-editor/components/pieChart/PieBox.vue delete mode 100644 src/views/custom-query/echarts-editor/components/radarChart/RadarBox.vue delete mode 100644 src/views/custom-query/echarts-editor/index.vue delete mode 100644 src/views/custom-query/query-page/index.vue delete mode 100644 src/views/custom-query/sql/SqlDesign.vue delete mode 100644 src/views/custom-query/sql/index.vue delete mode 100644 src/views/custom-query/table-management/editTable.vue delete mode 100644 src/views/custom-query/table-management/importTable.vue delete mode 100644 src/views/custom-query/table-management/index.vue delete mode 100644 src/views/custom-query/topo/components/changeImage/ChangeImage.vue delete mode 100644 src/views/custom-query/topo/components/changeImage/SettingImageDialog.vue delete mode 100644 src/views/custom-query/topo/index.vue delete mode 100644 src/views/custom-query/topo/top/behavior/click-er-edge.js delete mode 100644 src/views/custom-query/topo/top/behavior/click-er-node.js delete mode 100644 src/views/custom-query/topo/top/behavior/drag-add-edge.js delete mode 100644 src/views/custom-query/topo/top/behavior/drag-event-edit.js delete mode 100644 src/views/custom-query/topo/top/behavior/hover-event-edit.js delete mode 100644 src/views/custom-query/topo/top/behavior/index.js delete mode 100644 src/views/custom-query/topo/top/behavior/keyup-event-edit.js delete mode 100644 src/views/custom-query/topo/top/components/FooterBar.vue delete mode 100644 src/views/custom-query/topo/top/components/HeaderBar.vue delete mode 100644 src/views/custom-query/topo/top/config/edge.js delete mode 100644 src/views/custom-query/topo/top/config/index.js delete mode 100644 src/views/custom-query/topo/top/edge/base.js delete mode 100644 src/views/custom-query/topo/top/edge/index.js delete mode 100644 src/views/custom-query/topo/top/edge/top-cubic.js delete mode 100644 src/views/custom-query/topo/top/elements/button.vue delete mode 100644 src/views/custom-query/topo/top/elements/checkbox.vue delete mode 100644 src/views/custom-query/topo/top/elements/dropdown.vue delete mode 100644 src/views/custom-query/topo/top/elements/index.js delete mode 100644 src/views/custom-query/topo/top/elements/loading.vue delete mode 100644 src/views/custom-query/topo/top/graph/index.js delete mode 100644 src/views/custom-query/topo/top/index.vue delete mode 100644 src/views/custom-query/topo/top/node/dice-er-box.js delete mode 100644 src/views/custom-query/topo/top/node/index.js delete mode 100644 src/views/custom-query/topo/top/theme/dark-style.js delete mode 100644 src/views/custom-query/topo/top/theme/default-style.js delete mode 100644 src/views/custom-query/topo/top/theme/index.js delete mode 100644 src/views/custom-query/topo/top/theme/office-style.js delete mode 100644 src/views/custom-query/topo/top/toolbar-edit.vue delete mode 100644 src/views/custom-query/topo/top/toolbar-preview.vue delete mode 100644 src/views/custom-query/topo/top/topology.vue delete mode 100644 src/views/custom-query/topo/topologyDesign.vue delete mode 100644 src/views/custom-query/topo/utils/anchor/draw_mark.js delete mode 100644 src/views/custom-query/topo/utils/anchor/index.js delete mode 100644 src/views/custom-query/topo/utils/anchor/set-state.js delete mode 100644 src/views/custom-query/topo/utils/anchor/update.js delete mode 100644 src/views/custom-query/topo/utils/collapse/index.js delete mode 100644 src/views/custom-query/topo/utils/collapse/set-state.js delete mode 100644 src/views/custom-query/topo/utils/date.js delete mode 100644 src/views/custom-query/topo/utils/edge/index.js delete mode 100644 src/views/custom-query/topo/utils/edge/set-state.js delete mode 100644 src/views/custom-query/topo/utils/index.js delete mode 100644 src/views/custom-query/topo/utils/node/index.js delete mode 100644 src/views/custom-query/topo/utils/node/set-state.js delete mode 100644 src/views/rapid/gen/basicInfoForm.vue delete mode 100644 src/views/rapid/gen/editTable.vue delete mode 100644 src/views/rapid/gen/importTable.vue delete mode 100644 src/views/rapid/gen/index.vue delete mode 100644 src/views/rapid/gen/tableInfo.vue delete mode 100644 src/views/rapid/regular/index.vue delete mode 100644 src/views/rapid/source/index.vue delete mode 100644 src/views/steps/step/Step1.vue delete mode 100644 src/views/steps/step/Step2.vue delete mode 100644 src/views/steps/step/Step3.vue delete mode 100644 src/views/steps/step/Step4.vue delete mode 100644 src/views/steps/step/Step5.vue delete mode 100644 src/views/steps/step/index.vue diff --git a/public/favicon.ico b/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..9d7795544343653d81f7f0c2487aeefa1f5154d5 100644 GIT binary patch literal 65100 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

LWPqI&QnNv3nJ680^b{W+Djh{AL$+qLn~l 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 diff --git a/src/api/custom-query/adapter.js b/src/api/custom-query/adapter.js deleted file mode 100644 index 0d821bc..0000000 --- a/src/api/custom-query/adapter.js +++ /dev/null @@ -1,61 +0,0 @@ -import request from '@/utils/request.js' - -// 请求数据源适配器list -export const getDataAdapterList = (params) => { - return request({ - url: '/custom/query/query/adapter', - method: 'get', - params - }) -} - -//获取到option列表 -export const getDataAdapterOpt = () => { - return request({ - url: '/custom/query/query/adapter/option', - method: 'get', - }) -} - -// 获取数据源适配器详情 -export const getDataAdapterDetails = (dataAdapterId) => { - return request({ - url: '/custom/query/query/adapter/' + dataAdapterId, - method: 'get' - }) -} - -// 新增数据源适配器 -export const addDataAdapter = (data) => { - return request({ - url: '/custom/query/query/adapter', - method: 'post', - data - }) -} -//模拟执行适配器函数 -export const executeAdapterMockData = (data) => { - return request({ - url: '/custom/query/query/adapter/mock/execute', - method: 'post', - data - }) -} - -// 修改数据源适配器 -export const editDataAdapter = (data) => { - return request({ - url: '/custom/query/query/adapter', - method: 'put', - data - }) -} - -// 删除数据源适配器 -export const delDataAdapter =(dataAdapterId) => { - return request({ - url: '/custom/query/query/adapter/' + dataAdapterId, - method: 'delete' - }) -} - diff --git a/src/api/custom-query/datamodel.js b/src/api/custom-query/datamodel.js deleted file mode 100644 index 45ad7c0..0000000 --- a/src/api/custom-query/datamodel.js +++ /dev/null @@ -1,66 +0,0 @@ -import request from '@/utils/request.js' - -// 请求数据源管理list -export const getDataSourceManageList = (params) => { - return request({ - url: '/custom/query/datasource', - method: 'get', - params - }) -} - -//获取到option列表 -export const getDataSourceManageOpt = () => { - return request({ - url: '/custom/query/datasource/option', - method: 'get', - }) -} - -// 获取数据源管理详情 -export const getDataSourceManageDetails = (queryDataSourceId) => { - return request({ - url: '/custom/query/datasource/' + queryDataSourceId, - method: 'get' - }) -} -// 获取数据源管理详情 -export const getDataSourceType = () => { - return request({ - url: '/custom/query/datasource/option/type', - method: 'get' - }) -} -// 获取校验规则option -export const getDataSourceOption = () => { - return request({ - url: '/custom/query/datasource/option', - method: 'get' - }) -} -// 新增数据源管理 -export const addDataSourceManage = (data) => { - return request({ - url: '/custom/query/datasource', - method: 'post', - data - }) -} - -// 修改数据源管理 -export const editDataSourceManage = (data) => { - return request({ - url: '/custom/query/datasource', - method: 'put', - data - }) -} - -// 删除数据源管理 -export const delDataSourceManage =(queryDataSourceId) => { - return request({ - url: '/custom/query/datasource/' + queryDataSourceId, - method: 'delete' - }) -} - diff --git a/src/api/custom-query/echarts.js b/src/api/custom-query/echarts.js deleted file mode 100644 index 5102760..0000000 --- a/src/api/custom-query/echarts.js +++ /dev/null @@ -1,36 +0,0 @@ -import request from '@/utils/request.js' - -export const getEchartsList = (params) => { - return request({ - url: '/custom/query/echarts', - method: 'get', - params - }) -} -export const getEchartsDetails = (echartsId) => { - return request({ - url: '/custom/query/echarts/' + echartsId, - method: 'get' - }) -} - -export const addEcharts = (data) => { - return request({ - url: '/custom/query/echarts', - method: 'post', - data - }) -} -export const editEcharts = (data) => { - return request({ - url: '/custom/query/echarts', - method: 'put', - data - }) -} -export const delEcharts=(echartsIdList) => { - return request({ - url: '/custom/query/echarts/' + echartsIdList, - method: 'delete' - }) -} diff --git a/src/api/custom-query/query-page.js b/src/api/custom-query/query-page.js deleted file mode 100644 index f25073d..0000000 --- a/src/api/custom-query/query-page.js +++ /dev/null @@ -1,22 +0,0 @@ -import request from '@/utils/request.js' - -// 获取查询页面信息 -export const getPageInfo = (queryId, params) => { - return request({ - url: '/custom/query/page/' + queryId, - method: 'get', - params: params - }) -} - -// 获取到页面数据 -export const getPageData = (params, data) => { - return request({ - url: '/custom/query/page/data', - method: 'post', - params: params, - data: data - }) -} - - diff --git a/src/api/custom-query/sql-search.js b/src/api/custom-query/sql-search.js deleted file mode 100644 index 1d14914..0000000 --- a/src/api/custom-query/sql-search.js +++ /dev/null @@ -1,37 +0,0 @@ -import request from '@/utils/request.js' - -export const getSqlInfo = (queryId) => { - return request({ - url: '/custom/query/sql/search/' + queryId, - method: 'get' - }) -} - -export const previewSql= (data,pageInfo) => { - return request({ - url:'/custom/query/sql/search/preview' , - method: 'put', - data, - params:pageInfo - }) -} -export const saveSqlQueryParams = (data) => { - return request({ - url: '/custom/query/sql/search', - method: 'post', - data - }) -} -export const sqlToLine = (data) => { - return request({ - url: '/custom/query/sql/search/publish', - method: 'post', - data - }) -} -export const sqlDownLine = (queryId) => { - return request({ - url: '/custom/query/sql/search/cancel/'+queryId, - method: 'put' - }) -} diff --git a/src/api/custom-query/sql.js b/src/api/custom-query/sql.js deleted file mode 100644 index d66bda8..0000000 --- a/src/api/custom-query/sql.js +++ /dev/null @@ -1,42 +0,0 @@ -import request from '@/utils/request.js' - -// 获取Sql List -export const getSqlList = (params) => { - return request({ - url: '/custom/query/sql/uni', - method: 'get', - params - }) -} -// 获取Sql详情 -export const getSqlDetails = (sqlId) => { - return request({ - url: '/custom/query/sql/uni/' + sqlId, - method: 'get' - }) -} -// 新增Sql -export const addSql = (data) => { - return request({ - url: '/custom/query/sql/uni', - method: 'post', - data - }) -} - -// 修改Sql -export const editSql = (data) => { - return request({ - url: '/custom/query/sql/uni', - method: 'put', - data - }) -} - -// 删除Sql -export const delSql =(idList) => { - return request({ - url: '/custom/query/sql/uni/' + idList, - method: 'delete' - }) -} diff --git a/src/api/custom-query/table.js b/src/api/custom-query/table.js deleted file mode 100644 index 63335e1..0000000 --- a/src/api/custom-query/table.js +++ /dev/null @@ -1,70 +0,0 @@ -import request from '@/utils/request.js' - -//获取表格维护列表 -export const getTableInfo = (params) => { - return request({ - url: '/custom/query/table', - method: 'get', - params - }) -} -export const getDynamicTableList = (params) => { - return request({ - url: '/custom/query/dynamic/table', - method: 'get', - params - }) -} -//根据数据源获取到表格option信息 -export const getAssociationTableOption = (datasourceId) => { - return request({ - url: '/custom/query/table/option/' + datasourceId, - method: 'get' - }) -} -//获取表格字段option信息 -export const getAssociationFieldOption = (tableId) => { - return request({ - url: '/custom/query/table/column/option/' + tableId, - method: 'get' - }) -} -// 获取详细信息 -export const getTableDetails = (tableId) => { - return request({ - url: '/custom/query/table/' + tableId, - method: 'get' - }) -} -// 导入表信息 -export const addTableInfo= (data) => { - return request({ - url: '/custom/query/table/import', - method: 'post', - data - }) -} - -// 修改自定义查询表格维护 -export const editTable = (data) => { - return request({ - url: '/custom/query/table', - method: 'put', - data - }) -} -// 同步数据库 -export const syncDatabase = (tableId) => { - return request({ - url: '/custom/query/table/sync/'+ tableId, - method: 'put' - }) -} - -// 删除自定义查询表格维护 -export const delTable=(tableId) => { - return request({ - url: '/custom/query/table/' + tableId, - method: 'delete' - }) -} diff --git a/src/api/custom-query/topo-search.js b/src/api/custom-query/topo-search.js deleted file mode 100644 index a4cb4df..0000000 --- a/src/api/custom-query/topo-search.js +++ /dev/null @@ -1,47 +0,0 @@ -import request from '@/utils/request.js' - -// 获取topo拖拽数据信息 -export const getTopoDragInfo = (queryId) => { - return request({ - url: '/custom/query/topo/search/' + queryId, - method: 'get' - }) -} -export const saveTopo = (data) => { - return request({ - url: '/custom/query/topo/search', - method: 'post', - data - }) -} -export const previewTopo = (data,pageInfo) => { - return request({ - url: '/custom/query/topo/search/preview', - method: 'post', - data, - params:pageInfo, - }) -} -export const previewTopologyData = (data,pageInfo) => { - return request({ - url: '/custom/query/topo/search/preview/data', - method: 'post', - data, - params:pageInfo, - }) -} - -export const topoToLine = (data) => { - return request({ - url: '/custom/query/topo/search/publish', - method: 'post', - data - }) -} - -export const topoDownLine = (queryId) => { - return request({ - url: '/custom/query/topo/search/cancel/'+queryId, - method: 'put' - }) -} diff --git a/src/api/custom-query/topo.js b/src/api/custom-query/topo.js deleted file mode 100644 index 2de4b31..0000000 --- a/src/api/custom-query/topo.js +++ /dev/null @@ -1,42 +0,0 @@ -import request from '@/utils/request.js' - -// 获取topoList -export const getTopoList = (params) => { - return request({ - url: '/custom/query/topo/uni', - method: 'get', - params - }) -} -// 获取topo详情 -export const getTopoDetails = (topoId) => { - return request({ - url: '/custom/query/topo/uni/' + topoId, - method: 'get' - }) -} -// 新增topo -export const addTopo = (data) => { - return request({ - url: '/custom/query/topo/uni', - method: 'post', - data - }) -} - -// 修改topo -export const editTopo = (data) => { - return request({ - url: '/custom/query/topo/uni', - method: 'put', - data - }) -} - -// 删除topo -export const delTopo =(idList) => { - return request({ - url: '/custom/query/topo/uni/' + idList, - method: 'delete' - }) -} diff --git a/src/router/index.js b/src/router/index.js index 270b259..751d995 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -82,15 +82,6 @@ const router = createRouter({ breadcrumb: true } }, - { - path: '/rapid/gen/edit/:tableId(\\d+)', - name: 'genEdit', - component: () => import('@/views/rapid/gen/editTable.vue'), - meta: { - title: '数据库生成配置', - breadcrumb: true - } - }, { path: '/workflow/process/edit/:deploymentId', name: 'processEdit', @@ -154,53 +145,8 @@ const router = createRouter({ breadcrumb: false } }, - { - path: '/custom/query/sql/design/:queryId', - name: 'sql', - component: () => import('@/views/custom-query/sql/SqlDesign.vue'), - meta: { - title: '自定义sql查询配置', - breadcrumb: true - } - }, - { - path: '/custom/query/data/adapter/design/:queryId', - name: 'dataAdapter', - component: () => import('@/views/custom-query/data-adapter/DataAdapterDesign.vue'), - meta: { - title: '自定义数据适配器', - breadcrumb: true - } - }, - { - path: '/custom/query/echarts/design/:queryId', - name: 'echarts', - component: () => import('@/views/custom-query/echarts-editor/EchartsDesign.vue'), - meta: { - title: '自定义echarts查询配置', - breadcrumb: true - } - }, - { - path: '/rapid/data/:dsId(\\d+)', - name: 'rapid', - component: () => import('@/views/rapid/gen/index.vue'), - meta: { - title: '数据源关联数据', - breadcrumb: true - } - }, ] }, - { - path: '/topo/design/:queryId', - name: 'topEdit', - component: () => import('@/views/custom-query/topo/topologyDesign.vue'), - meta: { - title: 'top', - breadcrumb: false - } - }, { path: '/forbidden', name: 'forbidden', diff --git a/src/views/custom-query/data-adapter/DataAdapterDesign.vue b/src/views/custom-query/data-adapter/DataAdapterDesign.vue deleted file mode 100644 index fdfe570..0000000 --- a/src/views/custom-query/data-adapter/DataAdapterDesign.vue +++ /dev/null @@ -1,71 +0,0 @@ - - - - - diff --git a/src/views/custom-query/data-adapter/index.vue b/src/views/custom-query/data-adapter/index.vue deleted file mode 100644 index cf07e13..0000000 --- a/src/views/custom-query/data-adapter/index.vue +++ /dev/null @@ -1,285 +0,0 @@ - - - - - diff --git a/src/views/custom-query/datamodel/index.vue b/src/views/custom-query/datamodel/index.vue deleted file mode 100644 index 1c3e130..0000000 --- a/src/views/custom-query/datamodel/index.vue +++ /dev/null @@ -1,392 +0,0 @@ - - - - diff --git a/src/views/custom-query/echarts-editor/EchartsDesign.vue b/src/views/custom-query/echarts-editor/EchartsDesign.vue deleted file mode 100644 index f2e7f7c..0000000 --- a/src/views/custom-query/echarts-editor/EchartsDesign.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - diff --git a/src/views/custom-query/echarts-editor/components/AxisBox.vue b/src/views/custom-query/echarts-editor/components/AxisBox.vue deleted file mode 100644 index 459077f..0000000 --- a/src/views/custom-query/echarts-editor/components/AxisBox.vue +++ /dev/null @@ -1,538 +0,0 @@ - - - diff --git a/src/views/custom-query/echarts-editor/components/ChartsOptions.vue b/src/views/custom-query/echarts-editor/components/ChartsOptions.vue deleted file mode 100644 index f7332c7..0000000 --- a/src/views/custom-query/echarts-editor/components/ChartsOptions.vue +++ /dev/null @@ -1,307 +0,0 @@ - - - diff --git a/src/views/custom-query/echarts-editor/components/EchartsEditor.vue b/src/views/custom-query/echarts-editor/components/EchartsEditor.vue deleted file mode 100644 index d1962db..0000000 --- a/src/views/custom-query/echarts-editor/components/EchartsEditor.vue +++ /dev/null @@ -1,307 +0,0 @@ - - - - diff --git a/src/views/custom-query/echarts-editor/components/barChart/AdvancedSettings.vue b/src/views/custom-query/echarts-editor/components/barChart/AdvancedSettings.vue deleted file mode 100644 index 91d15fd..0000000 --- a/src/views/custom-query/echarts-editor/components/barChart/AdvancedSettings.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - \ No newline at end of file diff --git a/src/views/custom-query/echarts-editor/components/barChart/BasicSetting.vue b/src/views/custom-query/echarts-editor/components/barChart/BasicSetting.vue deleted file mode 100644 index 48817c6..0000000 --- a/src/views/custom-query/echarts-editor/components/barChart/BasicSetting.vue +++ /dev/null @@ -1,140 +0,0 @@ - - - diff --git a/src/views/custom-query/echarts-editor/components/lineChart/AdvancedSettings.vue b/src/views/custom-query/echarts-editor/components/lineChart/AdvancedSettings.vue deleted file mode 100644 index 91d15fd..0000000 --- a/src/views/custom-query/echarts-editor/components/lineChart/AdvancedSettings.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - \ No newline at end of file diff --git a/src/views/custom-query/echarts-editor/components/lineChart/BasicSetting.vue b/src/views/custom-query/echarts-editor/components/lineChart/BasicSetting.vue deleted file mode 100644 index dfce2e3..0000000 --- a/src/views/custom-query/echarts-editor/components/lineChart/BasicSetting.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - diff --git a/src/views/custom-query/echarts-editor/components/pieChart/BasicSetting.vue b/src/views/custom-query/echarts-editor/components/pieChart/BasicSetting.vue deleted file mode 100644 index a8a4a35..0000000 --- a/src/views/custom-query/echarts-editor/components/pieChart/BasicSetting.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/custom-query/echarts-editor/components/pieChart/PieBox.vue b/src/views/custom-query/echarts-editor/components/pieChart/PieBox.vue deleted file mode 100644 index dfd79bc..0000000 --- a/src/views/custom-query/echarts-editor/components/pieChart/PieBox.vue +++ /dev/null @@ -1,116 +0,0 @@ - - - - - diff --git a/src/views/custom-query/echarts-editor/components/radarChart/RadarBox.vue b/src/views/custom-query/echarts-editor/components/radarChart/RadarBox.vue deleted file mode 100644 index 4493dc0..0000000 --- a/src/views/custom-query/echarts-editor/components/radarChart/RadarBox.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/src/views/custom-query/echarts-editor/index.vue b/src/views/custom-query/echarts-editor/index.vue deleted file mode 100644 index f2e7f7c..0000000 --- a/src/views/custom-query/echarts-editor/index.vue +++ /dev/null @@ -1,233 +0,0 @@ - - - diff --git a/src/views/custom-query/query-page/index.vue b/src/views/custom-query/query-page/index.vue deleted file mode 100644 index aecc0b0..0000000 --- a/src/views/custom-query/query-page/index.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/src/views/custom-query/sql/SqlDesign.vue b/src/views/custom-query/sql/SqlDesign.vue deleted file mode 100644 index cf0a170..0000000 --- a/src/views/custom-query/sql/SqlDesign.vue +++ /dev/null @@ -1,486 +0,0 @@ - - - - - diff --git a/src/views/custom-query/sql/index.vue b/src/views/custom-query/sql/index.vue deleted file mode 100644 index 4dee0f7..0000000 --- a/src/views/custom-query/sql/index.vue +++ /dev/null @@ -1,351 +0,0 @@ - - - - - diff --git a/src/views/custom-query/table-management/editTable.vue b/src/views/custom-query/table-management/editTable.vue deleted file mode 100644 index f5a6b88..0000000 --- a/src/views/custom-query/table-management/editTable.vue +++ /dev/null @@ -1,316 +0,0 @@ - - - - - diff --git a/src/views/custom-query/table-management/importTable.vue b/src/views/custom-query/table-management/importTable.vue deleted file mode 100644 index 0bcfd2c..0000000 --- a/src/views/custom-query/table-management/importTable.vue +++ /dev/null @@ -1,201 +0,0 @@ - - - - diff --git a/src/views/custom-query/table-management/index.vue b/src/views/custom-query/table-management/index.vue deleted file mode 100644 index f5c1df6..0000000 --- a/src/views/custom-query/table-management/index.vue +++ /dev/null @@ -1,249 +0,0 @@ - - - diff --git a/src/views/custom-query/topo/components/changeImage/ChangeImage.vue b/src/views/custom-query/topo/components/changeImage/ChangeImage.vue deleted file mode 100644 index 3ba888e..0000000 --- a/src/views/custom-query/topo/components/changeImage/ChangeImage.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/components/changeImage/SettingImageDialog.vue b/src/views/custom-query/topo/components/changeImage/SettingImageDialog.vue deleted file mode 100644 index 1927844..0000000 --- a/src/views/custom-query/topo/components/changeImage/SettingImageDialog.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/index.vue b/src/views/custom-query/topo/index.vue deleted file mode 100644 index 24c7dec..0000000 --- a/src/views/custom-query/topo/index.vue +++ /dev/null @@ -1,352 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/behavior/click-er-edge.js b/src/views/custom-query/topo/top/behavior/click-er-edge.js deleted file mode 100644 index 9668e04..0000000 --- a/src/views/custom-query/topo/top/behavior/click-er-edge.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @author: clay - * @data: 2021/5/14 23:20 - * @email: clay@hchyun.com - * @description: node er图点击事件 - */ -let vm = null; - -const sendThis = (_this) => { - vm = _this; -}; - -export default { - sendThis, - name: "click-er-edge", - options: { - getEvents() { - return { - "edge:click": "onEdgeClick", - "edge:contextmenu": "onEdgeRightClick" - }; - }, - /** - * 点击连线函数 - * @param event - */ - onEdgeClick(event) { - let clickEdge = event.item; - clickEdge.setState("selected", !clickEdge.hasState("selected")); - this.singleClickEdge(event) - // vm.editCurrentFocus("edge") - // this.updateVmData(event); - }, - /** - * 右键点击线 - * @param event - */ - onEdgeRightClick(event) { - this.singleClickEdge(event) - }, - singleClickEdge(event) { - let graph = vm.getGraph(); - let clickEdge = event.item; - let clickEdgeModel = toRaw(clickEdge.getModel()); - let selectedEdges = graph.findAllByState("edge", "selected"); - // 如果当前点击节点不是之前选中的单个节点,才进行下面的处理 - if (!(selectedEdges.length === 1 && clickEdgeModel.id === selectedEdges[0].getModel().id)) { - // 先取消所有节点的选中状态 - graph.findAllByState("edge", "selected").forEach(edge => { - edge.setState("selected", false); - }); - // 再添加该节点的选中状态 - clickEdge.setState("selected", true); - vm.editCurrentFocus("edge") - this.updateVmData(event); - }else { - vm.editCurrentFocus("edge") - this.updateVmData(event); - } - }, - updateVmData(event) { - // 更新vm的data: selectedEdge 和 selectedEdgeParams - let clickEdge = event.item; - if (clickEdge.hasState("selected")) { - let clickEdgeModel = toRaw(clickEdge.getModel()); - vm.editSelectedEdge(clickEdge) - let edgeAppConfig = { ...vm.getEdgeAppConfig() }; - Object.keys(edgeAppConfig).forEach(function(key) { - edgeAppConfig[key] = ""; - }); - vm.editSelectedEdgeParams({ - label: clickEdgeModel.label || "", - relationalItem: clickEdgeModel.relationalItem, - sourceColumn: clickEdgeModel.sourceColumn, - targetColumn: clickEdgeModel.targetColumn, - appConfig: { ...edgeAppConfig, ...clickEdgeModel.appConfig } - }) - } - }, - } -}; diff --git a/src/views/custom-query/topo/top/behavior/click-er-node.js b/src/views/custom-query/topo/top/behavior/click-er-node.js deleted file mode 100644 index b06e324..0000000 --- a/src/views/custom-query/topo/top/behavior/click-er-node.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * @author: clay - * @data: 2021/5/14 23:20 - * @email: clay@hchyun.com - * @description: node er图点击事件 - */ -const isInBBox = (point, bbox) => { - const { - x, - y - } = point; - const { - minX, - minY, - maxX, - maxY - } = bbox; - - return x < maxX && x > minX && y > minY && y < maxY; -}; - -let vm = null; -const sendThis = (_this) => { - vm = _this; -}; - -export default { - sendThis, - name: "click-er-node", - options: { - getEvents() { - return { - wheel: "scroll", - "node:click": "onNodeClick", - "node:contextmenu": "onNodeRightClick", - "canvas:click": "onCanvasClick" - }; - }, - //滚动事件监听 - scroll(event) { - //禁止滚动的默认事件 - event.preventDefault(); - let graph = vm.getGraph() - // ↓|| vm.getClickCtrlValue() === true - if (vm.getClickCtrlValue()) { - if (graph && !graph.destroyed) { - if (event.deltaY > 0) { - graph.zoom(0.8, {x: event.x, y: event.y}) - } else { - graph.zoom(1.2, {x: event.x, y: event.y}) - } - } - } else { - //graph.getNodes()获取 Combo 中所有子节点 - const nodes = graph.getNodes().filter((n) => { - const bbox = n.getBBox();//获取元素的包围盒。 - //将 clientX/clientY 坐标系的坐标值转换为 pointX/pointY 的坐标值。 - return isInBBox(graph.getPointByClient(event.clientX, event.clientY), bbox); - }); - if (nodes) { - nodes.forEach((node) => { - const model = node.getModel(); - if (model.columns.length < 9) { - return; - } - const idx = model.startIndex || 0; // 获取model的startIndex属性,如果没有则使用0赋值给变量idx - // this.start = idx; // 这里将idx赋值给变量this.start - let startX = model.startX || 0.5; // 获取model的startX属性,如果没有则使用0.5赋值给变量startX - //正值向下滚动,负值向上滚动 - let startIndex = idx + event.deltaY * 0.018; // 计算startIndex值,将idx与event的deltaY属性值乘以0.018相加赋值给变量startIndex - if ((model.columns.length - idx) < 10 && startIndex > idx) { // 判断条件,判断model的columns数组的长度减去idx的值是否小于10,并且startIndex的值是否大于idx - return; // 如果条件满足,则结束函数的执行 - } - startX -= event.deltaX;//deltaX 属性在向右滚动时返回正值,向左滚动时返回负值,否则为 0。 - - //对startIndex进行边界检查和调整 - if (startIndex < 0) { - startIndex = 0; - } - if (startX > 0) { - startX = 0; - } - if (startIndex > model.columns.length - 1) { - startIndex = model.columns.length - 1; - } - - graph.update(node, { - startIndex, - startX - }); - }); - } - } - }, - //节点左键点击监听 - onNodeClick(event) { - if (event) { - vm.editCurrentFocus("node") - vm.editRightMenuShow(false) - this.shrinkage(event); - this.updateVmData(event); - } - }, - /** - * todo 右键打开设置面板 - * @param event - */ - onNodeRightClick(event) { - this.updateVmData(event); - vm.editTableColumnEditOpen(true) - }, - onCanvasClick() { - vm.editCurrentFocus("canvas") - vm.editRightMenuShow(false) - }, - updateVmData(event) { - let clickNode = event.item; - clickNode.setState("selected", true); - vm.editSelectedNode(clickNode); - let clickNodeModel = toRaw(clickNode.getModel()); - let nodeAppConfig = {...vm.getNodeAppConfig()}; - Object.keys(nodeAppConfig).forEach(function (key) { - nodeAppConfig[key] = ""; - }); - vm.editSelectedNodeParams({ - label: clickNodeModel.label || "", - columns: clickNodeModel.columns, - appConfig: {...nodeAppConfig, ...clickNodeModel.appConfig} - }) - }, - shrinkage(e) { - if (!e.item) { - return; - } - const graph = vm.getGraph(); - const name=e.shape.get("name") - if (name === "collapse") { - graph.updateItem(e.item, { - collapsed: true, - size: [300, 50], - height: 44 - }); - setTimeout(() => graph.layout(), 100); - } else if (name === "expand") { - graph.updateItem(e.item, { - collapsed: false, - size: [300, 500], - height: 316 - }); - setTimeout(() => graph.layout(), 100); - } - // else { - // const model = e.item.getModel(); - // } - }, - } -}; diff --git a/src/views/custom-query/topo/top/behavior/drag-add-edge.js b/src/views/custom-query/topo/top/behavior/drag-add-edge.js deleted file mode 100644 index 8758774..0000000 --- a/src/views/custom-query/topo/top/behavior/drag-add-edge.js +++ /dev/null @@ -1,232 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/16 - * @description: edit mode: 通过拖拽节点上的锚点添加连线 - */ -import utils from "../../utils"; -import theme from "../theme"; -import {ElMessage} from "element-plus"; - -// 用来获取调用此js的vue组件实例(this) -let vm = null; - -const sendThis = (_this) => { - vm = _this; -}; - -export default { - sendThis, // 暴露函数 - name: "drag-add-edge", - options: { - getEvents() { - return { - "node:mousedown": "onNodeMousedown", - "node:mouseup": "onNodeMouseup", - "edge:mouseup": "onEdgeMouseup", - "mousemove": "onMousemove" - }; - }, - onNodeMousedown(event) { - let self = this; - // 交互过程中的信息 - self.evtInfo = { - action: null, - node: event.item, - target: event.target, - }; - if (self.evtInfo.target && self.evtInfo.target.attrs.name) { - // todo...未来可能针对锚点增加其它功能(例如拖拽调整大小) - switch (self.evtInfo.target.attrs.name) { - case "anchor"://点击锚点中间 - self.evtInfo.action = "drawEdge"; - break; - case "anchorBg"://点击锚点 - self.evtInfo.action = "drawEdge"; - break; - } - } - if (self.evtInfo && self.evtInfo.action) { - self[self.evtInfo.action].start.call(self, event); - } - }, - onNodeMouseup(event) { - let self = this; - if (self.evtInfo && self.evtInfo.action) { - self[self.evtInfo.action].stop.call(self, event); - } - }, - onEdgeMouseup(event) { - let self = this; - if (self.evtInfo && self.evtInfo.action === "drawEdge") { - self[self.evtInfo.action].stop.call(self, event); - } - }, - onMousemove(event) { - let self = this; - if (self.evtInfo && self.evtInfo.action) { - self[self.evtInfo.action].move.call(self, event); - } - }, - drawEdge: { - isMoving: false, - currentLine: null, - start: function (event) { - let self = this; - let themeStyle = theme.defaultStyle; // todo...先使用默认主题,后期可能增加其它风格的主体 - - // ************** 暂存【连线】前的数据状态 start ************** - let graph = vm.getGraph(); - self.historyData = JSON.stringify(graph.save()); - // ************** 暂存【连线】前的数据状态 end ************** - - let sourceAnchor = self.evtInfo.node.getAnchorPoints(); - let sourceNodeModel = toRaw(self.evtInfo.node.getModel()); - // 锚点数据 - let anchorPoints = self.evtInfo.node.getAnchorPoints(); - // 处理线条目标点 - if (anchorPoints && anchorPoints.length) { - // 获取距离指定坐标最近的一个锚点 - sourceAnchor = self.evtInfo.node.getLinkPoint({ - x: event.x, - y: event.y - }) - } - // let relational = vm.getRelationalMap().get(sourceNodeModel.tableId) - let relational = vm.getRelationalMap().map(item => { - if (item.mainId === sourceNodeModel.tableId) { - return item - } - }) - //item.columnName+':'+item.columnComment - let columns = [] - sourceNodeModel.columns.forEach(item => { - let column = { - columnName: item.columnName, - columnComment: item.columnComment - } - columns.push(column) - }) - self.drawEdge.currentLine = self.graph.addItem("edge", { - // id: G6.Util.uniqueId(), // 这种生成id的方式有bug,会重复 - id: utils.generateUUID(), - // 起始节点 - source: sourceNodeModel.id, - sourceColumn: columns, - sourceAnchor: sourceAnchor ? sourceAnchor.anchorIndex : "", - // 终止节点/位置 - relational: relational, - target: { - x: event.x, - y: event.y - }, - type: self.graph.$C.edge.type || "top-cubic", - style: themeStyle.edgeStyle.default || self.graph.$C.edge.style - }); - self.drawEdge.isMoving = true; - }, - move(event) { - let self = this; - if (self.drawEdge.isMoving && self.drawEdge.currentLine) { - self.graph.updateItem(self.drawEdge.currentLine, { - target: { - x: event.x, - y: event.y - } - }); - } - }, - stop(event) { - let self = this; - if (self.drawEdge.isMoving) { - if (self.drawEdge.currentLine === event.item) { - // 画线过程中点击则移除当前画线 - self.graph.removeItem(event.item); - } else { - let targetNode = event.item; - let targetNodeModel = toRaw(targetNode.getModel());//节点的数据模型 - let targetAnchor = null; - // 锚点数据 - let anchorPoints = targetNode.getAnchorPoints(); - // 处理线条目标点 - let relational = self.drawEdge.currentLine.getModel().relational//边的数据模型,start函数中定义的包含该节点的关联关系 - let starts = false; - let relationalItem = null; - if (relational) { - relational.map(item => { - if (item) { - if (item.childId === targetNodeModel.tableId) { - starts = true - relationalItem = item - } else { - starts = false - } - } - }) - } - // 去掉关系验证 - // starts = true - if (starts) { - if (anchorPoints && anchorPoints.length > 0) { - // 获取距离指定坐标最近的一个锚点 - targetAnchor = targetNode.getLinkPoint({ - x: event.x, - y: event.y - }); - } - let columns = [] - targetNodeModel.columns.forEach(item => { - let column = { - columnName: item.columnName, - columnComment: item.columnComment - } - columns.push(column) - }) - self.graph.updateItem(self.drawEdge.currentLine, { - target: targetNodeModel.id, - relationalItem: relationalItem, - targetAnchor: targetAnchor ? targetAnchor.anchorIndex : "", - targetColumn: columns, - }); - - // ************** 记录historyData的逻辑 start ************** - if (self.historyData) { - let graph = self.graph; - // 如果当前点过【撤销】了,拖拽节点后没有【重做】功能 - // 重置undoCount,拖拽后的数据给(当前所在historyIndex + 1),且清空这个时间点之后的记录 - if (vm.getUndoCount() > 0) { - vm.editHistoryIndex(vm.getHistoryIndex() - vm.getUndoCount()); // 此时的historyIndex应当更新为【撤销】后所在的索引位置 - for (let i = 1; i <= vm.getUndoCount(); i++) { - let key = `graph_history_${vm.getHistoryIndex() + i}`; - vm.removeHistoryData(key); - } - vm.editUndoCount(0) - } else { - // 正常顺序执行的情况,记录拖拽线 前的数据状态 - let key = `graph_history_${vm.getHistoryIndex()}`; - vm.addHistoryData(key, self.historyData); - } - // 记录拖线后的数据状态 - const index = vm.getHistoryIndex() + 1; - vm.editHistoryIndex(index); - let key = `graph_history_${index}`; - let currentData = JSON.stringify(graph.save()); - vm.addHistoryData(key, currentData); - } - } else { - if (self.evtInfo.node.getModel().tableId === targetNodeModel.tableId) { - ElMessage.warning("不可连接自身") - } else { - ElMessage.warning("两表之间无关联关系") - } - self.graph.removeItem(self.drawEdge.currentLine); - } - // ************** 记录historyData的逻辑 end ************** - } - } - self.drawEdge.currentLine = null; - self.drawEdge.isMoving = false; - self.evtInfo = null; - } - } - } -}; diff --git a/src/views/custom-query/topo/top/behavior/drag-event-edit.js b/src/views/custom-query/topo/top/behavior/drag-event-edit.js deleted file mode 100644 index 10cfd43..0000000 --- a/src/views/custom-query/topo/top/behavior/drag-event-edit.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/16 - * @description: edit mode: 鼠标拖动节点的交互(记录拖拽前后的数据,用于【撤销】和【重做】) - */ - -// 用来获取调用此js的vue组件实例(this) -let vm = null -let historyData = null - -const sendThis = (_this) => { - vm = _this -} - -export default { - sendThis, // 暴露函数 - name: 'drag-event-edit', - options: { - getEvents() { - return { - 'node:dragstart': 'onNodeDragstart', - 'node:dragend': 'onNodeDragend' - } - }, - onNodeDragstart() { - let graph = vm.getGraph() - if(graph.cfg){ - historyData = JSON.stringify(graph.save()) - } - }, - onNodeDragend() { - if (historyData) { - let graph = vm.getGraph() - // 如果当前点过【撤销】了,拖拽节点后没有【重做】功能 - // 重置undoCount,拖拽后的数据给(当前所在historyIndex + 1),且清空这个时间点之后的记录 - if (vm.getUndoCount() > 0) { - vm.editHistoryIndex( vm.getHistoryIndex() - vm.getUndoCount()) // 此时的historyIndex应当更新为【撤销】后所在的索引位置 - for (let i = 1; i <= vm.getUndoCount(); i++) { - let key = `graph_history_${vm.getHistoryIndex() + i}` - vm.removeHistoryData(key) - } - vm.editUndoCount(0); - } else { - // 正常顺序执行的情况,记录拖拽前的数据状态 - let key = `graph_history_${vm.getHistoryIndex()}` - vm.addHistoryData(key, historyData) - } - // 记录拖拽后的数据状态 - const index=vm.getHistoryIndex()+ 1; - vm.editHistoryIndex(index); - let key = `graph_history_${index}` - let currentData = JSON.stringify(graph.save()) - vm.addHistoryData(key, currentData) - } - } - } -} diff --git a/src/views/custom-query/topo/top/behavior/hover-event-edit.js b/src/views/custom-query/topo/top/behavior/hover-event-edit.js deleted file mode 100644 index c6bf0e6..0000000 --- a/src/views/custom-query/topo/top/behavior/hover-event-edit.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/16 - * @description: edit mode: 悬浮交互 - */ -// 用来获取调用此js的vue组件实例(this) -let vm = null; -let hourItem = null; -const sendThis = (topo) => { - vm = topo; -}; -export default { - sendThis, // 暴露函数 - name: "hover-event-edit", - options: { - getEvents() { - return { - "node:mouseover": "onNodeHover", - // "node:mouseout": "onNodeOut", - // "mouseleave":"onNodeLeave", - }; - }, - onNodeHover(event) { - let graph = vm.getGraph(); - let hoverNode = event.item; - const name = event.shape.get("name");//todo ?? - const item = event.item; - if (name && name.startsWith("item")) { - graph.updateItem(item, {//更新元素,包括更新数据、样式等 - selectedIndex: Number(name.split("-")[1]) - }); - } else { - graph.updateItem(item, { - selectedIndex: NaN - }); - } - if (name && name.startsWith("marker")) { - hoverNode.setState("hover", true, graph); - hourItem=hoverNode; - }else { - if (hourItem!=null){ - hourItem.setState("hover", false) - } - } - }, - // onNodeOut(event) { - // console.log('移出节点') - // const name = event.shape.get("name"); - // let hoverNode = event.item; - // console.log('name',name) - // if (name && name.startsWith("marker")) { - // hoverNode.setState("hover", false); - // } - // if (hourItem!=null){ - // hourItem.setState("hover", false) - // } - // hoverNode.setState("hover", false); - // }, - // onNodeLeave(event) { - // console.log('移出节点2') - // if (hourItem!=null){ - // hourItem.setState("hover", false) - // } - // } - } -}; diff --git a/src/views/custom-query/topo/top/behavior/index.js b/src/views/custom-query/topo/top/behavior/index.js deleted file mode 100644 index c67b1b0..0000000 --- a/src/views/custom-query/topo/top/behavior/index.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/16 - * @description: register behaviors - */ - -import dragAddEdge from './drag-add-edge' -import hoverEventEdit from './hover-event-edit' -import dragEventEdit from './drag-event-edit' -import keyupEventEdit from './keyup-event-edit' -import clickErNode from './click-er-node' -import clickErEdge from './click-er-edge' - -const obj = { - dragAddEdge, - hoverEventEdit, - dragEventEdit, - keyupEventEdit, - clickErNode, - clickErEdge -} - -export default { - obj, - register(G6) { - Object.values(obj).map(item => { - G6.registerBehavior(item.name, item.options) - }) - } -} diff --git a/src/views/custom-query/topo/top/behavior/keyup-event-edit.js b/src/views/custom-query/topo/top/behavior/keyup-event-edit.js deleted file mode 100644 index 181bd83..0000000 --- a/src/views/custom-query/topo/top/behavior/keyup-event-edit.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/16 - * @description: edit mode: 键盘事件的交互,主要是删除节点和连线(记录删除前后的数据,用于【撤销】和【重做】) - */ - -// 用来获取调用此js的vue组件实例(this) -let vm = null; - -const sendThis = (_this) => { - vm = _this; -}; - -export default { - sendThis, // 暴露函数 - name: "keyup-event-edit", - options: { - getEvents() { - return { - "keyup": "onKeyup", - "keydown": "onKeydown", - }; - }, - onKeyup(event) { - let graph = vm.getGraph(); - let selectedNodes = graph.findAllByState("node", "selected"); - let selectedEdges = graph.findAllByState("edge", "selected"); - //按住键盘delete-46删除功能 - if (event.keyCode === 46 && (selectedNodes.length > 0 || selectedEdges.length > 0)) { - // ************** 记录【删除】前的数据状态 start ************** - let historyData = JSON.stringify(graph.save()); - let key = `graph_history_${vm.getHistoryIndex()}`; - vm.addHistoryData(key, historyData); - // ************** 记录【删除】前的数据状态 end ************** - - // 开始删除 - selectedNodes.forEach(item=>graph.removeItem(item)) - selectedEdges.forEach(item=>graph.removeItem(item)) - // ************** 记录【删除】后的数据状态 start ************** - // 如果当前点过【撤销】了,拖拽节点后将取消【重做】功能 - // 重置undoCount,【删除】后的数据状态给(当前所在historyIndex + 1),且清空这个时间点之后的记录 - if (vm.getUndoCount() > 0) { - vm.editHistoryIndex( vm.getHistoryIndex() - vm.getUndoCount()); // 此时的historyIndex应当更新为【撤销】后所在的索引位置 - for (let i = 1; i <= vm.getUndoCount(); i++) { - let key = `graph_history_${vm.getHistoryIndex() + i}`; - vm.removeHistoryData(key); - } - vm.editUndoCount(0); - } - // 记录【删除】后的数据状态 - const index=vm.getHistoryIndex()+ 1; - vm.editHistoryIndex(index); - key = `graph_history_${index}`; - let currentData = JSON.stringify(graph.save()); - vm.addHistoryData(key, currentData); - // ************** 记录【删除】后的数据状态 end ************** - } else if (event.keyCode == 17) {//ctrl键,将状态传给父组件,在clickErNode里面编写功能(按住ctrl,滚动后放大缩小ER图) - vm.editClickCtrl(false)//松开则为false - } - }, - onKeydown(event) { - if (event.keyCode == 17) {//ctrl键 - vm.editClickCtrl(true)//为true时:一直按着ctrl,以实现滚轮放大缩小功能 - } - } - } -}; diff --git a/src/views/custom-query/topo/top/components/FooterBar.vue b/src/views/custom-query/topo/top/components/FooterBar.vue deleted file mode 100644 index 4f5e008..0000000 --- a/src/views/custom-query/topo/top/components/FooterBar.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/components/HeaderBar.vue b/src/views/custom-query/topo/top/components/HeaderBar.vue deleted file mode 100644 index eb4df07..0000000 --- a/src/views/custom-query/topo/top/components/HeaderBar.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/config/edge.js b/src/views/custom-query/topo/top/config/edge.js deleted file mode 100644 index e908144..0000000 --- a/src/views/custom-query/topo/top/config/edge.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/16 - * @description: 线条的后期设置 - */ - -export default { - type: 'top-cubic', - style: { - startArrow: false, - endArrow: true - } -} diff --git a/src/views/custom-query/topo/top/config/index.js b/src/views/custom-query/topo/top/config/index.js deleted file mode 100644 index abed973..0000000 --- a/src/views/custom-query/topo/top/config/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/16 - * @description: 配置 - */ - -import edge from './edge' - -export default { - edge -} diff --git a/src/views/custom-query/topo/top/edge/base.js b/src/views/custom-query/topo/top/edge/base.js deleted file mode 100644 index f2b5599..0000000 --- a/src/views/custom-query/topo/top/edge/base.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @author: Clay - * @data: 2019/07/18 - * @description: 线公共方法 - */ - -import utils from '../../utils' - -export default { - draw(cfg, group) { - const { startPoint, endPoint } = cfg - const keyShape = group.addShape('path', { - className: 'edge-shape', - attrs: { - ...cfg.style, - path: [ - ['M', startPoint.x, startPoint.y], - ['L', endPoint.x, endPoint.y] - ] - }, - name: 'edge-shape' - }) - keyShape.attrs.endArrow = true - return keyShape - }, - setState(name, value, item) { - // 设置边状态 - utils.edge.setState(name, value, item) - } -} diff --git a/src/views/custom-query/topo/top/edge/index.js b/src/views/custom-query/topo/top/edge/index.js deleted file mode 100644 index bcbbbe4..0000000 --- a/src/views/custom-query/topo/top/edge/index.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/18 - * @description: register edges - */ - - -import topCubic from './top-cubic' - -const obj = { - topCubic -} - -export default function(G6) { - Object.values(obj).map(item => { - G6.registerEdge(item.name, item.options, item.extendName) - }) -} diff --git a/src/views/custom-query/topo/top/edge/top-cubic.js b/src/views/custom-query/topo/top/edge/top-cubic.js deleted file mode 100644 index c53d53f..0000000 --- a/src/views/custom-query/topo/top/edge/top-cubic.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @author: Clay - * @data: 2019/07/18 - * @description: 曲线 - */ - -import base from './base' -export default { - name: 'top-cubic', - extendName: 'cubic', - options: { - ...base - } -} diff --git a/src/views/custom-query/topo/top/elements/button.vue b/src/views/custom-query/topo/top/elements/button.vue deleted file mode 100644 index f9969c1..0000000 --- a/src/views/custom-query/topo/top/elements/button.vue +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/elements/checkbox.vue b/src/views/custom-query/topo/top/elements/checkbox.vue deleted file mode 100644 index b32dc05..0000000 --- a/src/views/custom-query/topo/top/elements/checkbox.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/elements/dropdown.vue b/src/views/custom-query/topo/top/elements/dropdown.vue deleted file mode 100644 index 4e995c3..0000000 --- a/src/views/custom-query/topo/top/elements/dropdown.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/elements/index.js b/src/views/custom-query/topo/top/elements/index.js deleted file mode 100644 index ff793df..0000000 --- a/src/views/custom-query/topo/top/elements/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * @author: clay - * @data: 2019/11/14 - * @description: ClayTop内部的通用组件 - */ - -import Checkbox from './checkbox.vue' -import Button from './button.vue' -import Dropdown from './dropdown.vue' -import Loading from './loading.vue' - -export { - Checkbox, - Button, - Dropdown, - Loading -} diff --git a/src/views/custom-query/topo/top/elements/loading.vue b/src/views/custom-query/topo/top/elements/loading.vue deleted file mode 100644 index fc14dd1..0000000 --- a/src/views/custom-query/topo/top/elements/loading.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/graph/index.js b/src/views/custom-query/topo/top/graph/index.js deleted file mode 100644 index 7f9801d..0000000 --- a/src/views/custom-query/topo/top/graph/index.js +++ /dev/null @@ -1,162 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/05 - * @description: 图的布局方式/图的初始化 - */ - -// import d3 from '../plugins/d3-installer' -import * as d3 from 'd3' -import theme from '../theme' - -/** - * 图的布局方式/图的初始化 - * @type {{commonGraph: (function(*, *): G6.Graph)}} - */ -const initGraph = { - /** - * 一般布局 - * @param G6 - * @param options - * @returns {G6.Graph} - */ - commonGraph: function(G6, options) { - let graphData = options.graphData - let themeStyle = theme.defaultStyle // todo...先使用默认主题,后期可能增加其它风格的主体 - // 生成G6实例 - let graph = new G6.Graph({ - plugins: options.plugins,//向 graph 注册插件 - container: options.container,//图的 DOM 容器,可以传入该 DOM 的 id 或者直接传入容器的 HTML 节点对象。 - width: options.width,//指定画布宽度,单位为 'px',默认为画布容器宽度。 - height: options.height,//指定画布高度 - // layout: { - // type: 'random', - // width: options.width, - // height: options.height - // }, - defaultNode: {//默认状态下节点的配置 - type: 'dice-er-box', - labelCfg: { - position: 'bottom' - } - }, - defaultEdge: {//默认状态下线的配置 - type: 'top-cubic', - labelCfg: { - position: 'center', - autoRotate: false - } - }, - nodeStateStyles: themeStyle.nodeStyle,//各个状态下节点的样式 - // nodeStyle: { - // selected: { - // shadowColor: '#626262', - // shadowBlur: 8, - // shadowOffsetX: -1, - // shadowOffsetY: 3 - // } - // }, - edgeStateStyles:{ - edgeStyle: { - default: { - stroke: '#e2e2e2', - lineWidth: 3, - lineAppendWidth: 10 - }, - selected: { - shadowColor: '#626262', - shadowBlur: 3 - } - }, - },//各个状态下边的样式 - modes: options.modes//设置画布的交互模式 - }) - // 将 read 方法分解成 data() 和 render 方法,便于整个生命周期的管理 - graph.read(graphData) - // 渲染图 - graph.render() - // 返回G6实例 - return graph - }, - /** - * 力导布局 - * @param G6 - * @param options - * @returns {*} - */ - forceLayoutGraph: function(resolve, G6, options) { - let graphData = options.graphData - let themeStyle = theme.defaultStyle // todo...先使用默认主题,后期可能增加其它风格的主体 - // 生成G6实例 - let graph = new G6.Graph({ - container: options.container, - width: options.width, - height: options.height, - nodeStateStyles: themeStyle.nodeStyle, - edgeStateStyles: themeStyle.edgeStyle - }) - // 初始化力导布局 - let simulation = d3 - .forceSimulation() - .force( - 'link', - d3 - .forceLink() - .id(function(d) { - return d.id - }) - .distance(linkDistance) - .strength(0.5) - ) - .force('charge', d3.forceManyBody().strength(-500).distanceMax(500).distanceMin(100)) - .force('center', d3.forceCenter(options.width / 2, options.height / 2)) - // 定义节点数据 - simulation.nodes(graphData.nodes).on('tick', ticked) - // 定义连线数据 - let edges = [] - for (let i = 0; i < graphData.edges.length; i++) { - edges.push({ - id: graphData.edges[i].id, - source: graphData.edges[i].source, - target: graphData.edges[i].target - }) - } - simulation.force('link').links(edges) - graph.data(graphData) - graph.render() - - function linkDistance(d) { - return 150 - } - - function ticked() { - // protect: planA: 移除事件监听器 planB: 手动停止力模拟 - if (graph.destroyed) { - // simulation.nodes(graphData.nodes).on('tick', null) - simulation.stop() - return - } - if (!graph.get('data')) { - // 若是第一次渲染,定义数据,渲染 - graph.data(graphData) - graph.render() - } else { - // 后续渲染,直接刷新所有点和边的位置 - graph.refreshPositions() - } - } - - // 控制时间: 只布局10秒 - let t = setTimeout(function() { - simulation.stop() - resolve(graph) - }, 10000) - - // 判断force-layout结束 - simulation.on('end', () => { - clearTimeout(t) - resolve(graph) - }) - } -} - -export default initGraph diff --git a/src/views/custom-query/topo/top/index.vue b/src/views/custom-query/topo/top/index.vue deleted file mode 100644 index fa3d9fc..0000000 --- a/src/views/custom-query/topo/top/index.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/src/views/custom-query/topo/top/node/dice-er-box.js b/src/views/custom-query/topo/top/node/dice-er-box.js deleted file mode 100644 index 41bd657..0000000 --- a/src/views/custom-query/topo/top/node/dice-er-box.js +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @author: clay - * @data: 2021/5/15 0:16 - * @email: clay@hchyun.com - * @description: draw anchor 绘制锚点 - */ -import utils from '../../utils/index' - -const itemHeight = 30; -export default { - name: 'dice-er-box', - options: { - /** - * 响应节点的状态变化。 - * 在需要使用动画来响应状态变化时需要被复写 - * @param {String} name 状态名称 - * @param {Object} value 状态值 - * @param {item} item 节点 - */ - setState(name, value, item) { - // 设置节点状态 - utils.node.setState(name, value, item); - // 设置锚点状态 - utils.anchor.setState(name, value, item); - }, - draw(cfg, group) { - const width = 250; - const height = 316; - const itemCount = 10; - const boxStyle = { - stroke: "#096DD9", - radius: 4, - }; - - const { - columns = [], - startIndex = 0, - selectedIndex, - collapsed, - icon, - } = cfg; - const list = columns; - const afterList = list.slice( - Math.floor(startIndex), - Math.floor(startIndex + itemCount - 1) - ); - const offsetY = (0.5 - (startIndex % 1)) * itemHeight + 30; - - //设置表名的容器 - group.addShape("rect", { - attrs: { - fill: boxStyle.stroke, - height: 30, - width, - radius: [boxStyle.radius, boxStyle.radius, 0, 0], - }, - draggable: true, - }); - - //设置左侧字体的边距 - let fontLeft = 12; - - // 设置图标 - if (icon && icon.show !== false) { - group.addShape("image", { - attrs: { - x: 8, - y: 8, - height: 16, - width: 16, - ...icon, - }, - }); - fontLeft += 18; - } - - //设置表名 - group.addShape("text", { - attrs: { - y: 22, - x: fontLeft, - fill: "#fff", - text: cfg.label, - fontSize: 12, - fontWeight: 500, - }, - }); - - //设置收缩部分的容器 - group.addShape("rect", { - attrs: { - x: 0, - y: collapsed ? 30 : 300, - height: 15, - width, - fill: "#eee", - radius: [0, 0, boxStyle.radius, boxStyle.radius], - cursor: "pointer", - }, - name: collapsed ? "expand" : "collapse", - }); - - //设置收缩显示字符 - group.addShape("text", { - attrs: { - x: width / 2 - 6, - y: (collapsed ? 30 : 300) + 12, - text: collapsed ? "+" : "-", - width, - fill: "#000", - radius: [0, 0, boxStyle.radius, boxStyle.radius], - cursor: "pointer", - }, - name: collapsed ? "expand" : "collapse", - }); - - //设置外边框 - const keyshape = group.addShape("rect", { - attrs: { - name: 'border', - x: 0, - y: 0, - width, - height: collapsed ? 45 : height, - ...boxStyle, - }, - //是否被允许拖拽 - draggable: true - }); - - //如果收缩状态,则返回当前图形 - if (collapsed) { - return keyshape; - } - //添加空白组 - const listContainer = group.addGroup({}); - //todo 设置裁剪对象,字体加粗? - listContainer.setClip({ - type: "rect", - attrs: { - x: -8, - y: 30, - width: width + 16, - height: 300 - 30, - }, - }); - listContainer.addShape({ - type: "rect", - attrs: { - x: 1, - y: 30, - width: width - 2, - height: 300 - 30, - fill: "#fff", - }, - draggable: true, - }); - - //如果list中的column字段超过10个 - if (list.length > itemCount) { - const barStyle = { - width: 4, - padding: 0, - boxStyle: { - stroke: "#00000022", - }, - innerStyle: { - fill: "#00000022", - }, - }; - - listContainer.addShape("rect", { - attrs: { - y: 30, - x: width - barStyle.padding - barStyle.width, - width: barStyle.width, - height: height - 30, - ...barStyle.boxStyle, - }, - }); - - //设置矩形高度 - const indexHeight = - afterList.length > itemCount ? - (afterList.length / list.length) * height : - 10; - - listContainer.addShape("rect", { - attrs: { - y: 30 + - barStyle.padding + - (startIndex / (list.length-8)) * (height - 30), - x: width - barStyle.padding - barStyle.width, - width: barStyle.width, - height: Math.min(height, indexHeight), - ...barStyle.innerStyle, - }, - }); - } - //渲染显示区域 - if (afterList) { - afterList.forEach((e, i) => { - //设置选中的列 - const isSelected = Math.floor(startIndex) + i === Number(selectedIndex); - let { - columnName = "", columnType,columnComment - } = e; - if (columnComment){ - columnName+= " : " + columnComment - } - if (columnType) { - columnName += " - " + columnType; - } - const label = columnName.length > 26 ? columnName.slice(0, 24) + "..." : columnName; - - listContainer.addShape("rect", { - attrs: { - x: 1, - y: i * itemHeight - itemHeight / 2 + offsetY, - width: width - 4, - height: itemHeight, - radius: 2, - fill:isSelected ? "#ddd" : "#fff", - lineWidth: 1, - cursor: "pointer", - }, - name: `item-${Math.floor(startIndex) + i}-content`, - draggable: true, - }); - - listContainer.addShape("text", { - attrs: { - x: 12, - y: i * itemHeight + offsetY + 6, - text: label, - fontSize: 12, - fill: "#000", - fontFamily: "Avenir,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol", - full: e, - fontWeight: isSelected ? 500 : 100, - cursor: "pointer", - }, - name: `item-${Math.floor(startIndex) + i}`, - }); - - //未来设置字段之间有锚点 - // if (!cfg.hideDot) { - // utils.anchor.erDrawLeft(group, label, 0, i * itemHeight + offsetY) - // utils.anchor.erDrawLeft(group,label,width,i * itemHeight + offsetY) - // listContainer.addShape("marker", { - // attrs: { - // x: 0, - // y: i * itemHeight + offsetY, - // r: 3, - // stroke: boxStyle.stroke, - // fill: "white", - // radius: 2, - // lineWidth: 1, - // cursor: "crosshair", - // }, - // - // name: 'marker-shape' - // }); - // listContainer.addShape("marker", { - // attrs: { - // x: width, - // y: i * itemHeight + offsetY, - // r: 3, - // stroke: boxStyle.stroke, - // fill: "white", - // radius: 2, - // lineWidth: 1, - // cursor: "crosshair", - // - // - // }, - // name: 'marker-shape' - // }); - // } - }); - } - return keyshape; - }, - // getAnchorPoints() { - // return [ - // [0, 0], - // [1, 0], - // ]; - // }, - // 绘制后附加锚点 - afterDraw(cfg, group) { - // 绘制锚点 - utils.anchor.drawMark(cfg, group) - }, - - } -} - - - - - diff --git a/src/views/custom-query/topo/top/node/index.js b/src/views/custom-query/topo/top/node/index.js deleted file mode 100644 index 7ed5492..0000000 --- a/src/views/custom-query/topo/top/node/index.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @author: clay - * @data: 2019/07/05 - * @description: register nodes - */ - - -import diceErBox from './dice-er-box' -const obj = { - diceErBox -} - -export default { - obj, - register(G6) { - Object.values(obj).map(item => { - G6.registerNode(item.name, item.options, item.extendName) - }) - } -} diff --git a/src/views/custom-query/topo/top/theme/dark-style.js b/src/views/custom-query/topo/top/theme/dark-style.js deleted file mode 100644 index 5c04978..0000000 --- a/src/views/custom-query/topo/top/theme/dark-style.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @author: clay - * @data: 2019/11/20 - * @description: dark style - */ - -export default { - // 节点样式 - nodeStyle: { - default: { - stroke: '#CED4D9', - fill: 'transparent', - shadowOffsetX: 0, - shadowOffsetY: 4, - shadowBlur: 10, - shadowColor: 'rgba(13, 26, 38, 0.08)', - lineWidth: 1, - radius: 4, - strokeOpacity: 0.7 - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - // shadowColor: '#626262', - // shadowBlur: 8, - // shadowOffsetX: -1, - // shadowOffsetY: 3 - }, - unselected: { - shadowColor: '' - } - }, - //todo 节点标签样式??修改不起 - nodeLabelCfg: { - positions: 'center', - style: { - fill: '#fff' - } - }, - // 连线样式 - edgeStyle: { - default: { - stroke: '#000000', - lineWidth: 2, - strokeOpacity: 0.92, - lineAppendWidth: 10 - // endArrow: true - }, - active: { - shadowColor: 'red', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - inactive: { - shadowColor: '' - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - unselected: { - shadowColor: '' - } - }, - // 锚点样式 - anchorStyle: { - default: { - radius: 3, - symbol: 'circle', - fill: '#FFFFFF', - fillOpacity: 0, - stroke: '#1890FF', - strokeOpacity: 0, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 1, - strokeOpacity: 1 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 1, - strokeOpacity: 1 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - // 锚点背景样式 - anchorBgStyle: { - default: { - radius: 10, - symbol: 'circle', - fill: '#1890FF', - fillOpacity: 0, - stroke: '#1890FF', - strokeOpacity: 0, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 1, - strokeOpacity: 1 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 0.3, - strokeOpacity: 0.5 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - - - nodeActivedOutterStyle: { lineWidth: 0 }, - groupSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - nodeSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - edgeActivedStyle: { stroke: '#1890FF', strokeOpacity: .92 }, - nodeActivedStyle: { fill: '#F3F9FF', stroke: '#1890FF' }, - groupActivedStyle: { stroke: '#1890FF' }, - edgeSelectedStyle: { lineWidth: 2, strokeOpacity: .92, stroke: '#A3B1BF' }, - nodeSelectedStyle: { fill: '#F3F9FF', stroke: '#1890FF', fillOpacity: .4 }, - groupSelectedStyle: { stroke: '#1890FF', fillOpacity: .92 }, - - groupBackgroundPadding: [40, 10, 10, 10], - groupLabelOffsetX: 10, - groupLabelOffsetY: 10, - edgeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - edgeLabelRectPadding: 4, - edgeLabelRectStyle: { fill: 'white' }, - nodeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - groupStyle: { stroke: '#CED4D9', radius: 4 }, - groupLabelStyle: { fill: '#666', textAlign: 'left', textBaseline: 'top' }, - multiSelectRectStyle: { fill: '#1890FF', fillOpacity: .08, stroke: '#1890FF', opacity: .1 }, - dragNodeHoverToGroupStyle: { stroke: '#1890FF', lineWidth: 2 }, - dragNodeLeaveFromGroupStyle: { stroke: '#BAE7FF', lineWidth: 2 }, - anchorPointStyle: { radius: 3.5, fill: '#fff', stroke: '#1890FF', lineAppendWidth: 12 }, - anchorHotsoptStyle: { radius: 12, fill: '#1890FF', fillOpacity: .25 }, - anchorHotsoptActivedStyle: { radius: 14 }, - anchorPointHoverStyle: { radius: 4, fill: '#1890FF', fillOpacity: 1, stroke: '#1890FF' }, - nodeControlPointStyle: { radius: 4, fill: '#fff', shadowBlur: 4, shadowColor: '#666' }, - edgeControlPointStyle: { radius: 6, symbol: 'square', lineAppendWidth: 6, fillOpacity: 0, strokeOpacity: 0 }, - nodeSelectedBoxStyle: { stroke: '#C2C2C2' }, - cursor: { - panningCanvas: '-webkit-grabbing', - beforePanCanvas: '-webkit-grab', - hoverNode: 'move', - hoverEffectiveAnchor: 'crosshair', - hoverEdge: 'default', - hoverGroup: 'move', - hoverUnEffectiveAnchor: 'default', - hoverEdgeControllPoint: 'crosshair', - multiSelect: 'crosshair' - }, - nodeDelegationStyle: { - stroke: '#1890FF', - fill: '#1890FF', - fillOpacity: .08, - lineDash: [4, 4], - radius: 4, - lineWidth: 1 - }, - edgeDelegationStyle: { stroke: '#1890FF', lineDash: [4, 4], lineWidth: 1 } -} diff --git a/src/views/custom-query/topo/top/theme/default-style.js b/src/views/custom-query/topo/top/theme/default-style.js deleted file mode 100644 index 7838462..0000000 --- a/src/views/custom-query/topo/top/theme/default-style.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: default style - */ - -export default { - // 节点样式 - nodeStyle: { - default: { - stroke: '#CED4D9', - fill: 'transparent', - // shadowOffsetX: 0, - // shadowOffsetY: 4, - shadowBlur: 10, - shadowColor: 'rgba(13, 26, 38, 0.08)', - lineWidth: 1, - radius: 4, - strokeOpacity: 0.7 - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 2, - // shadowOffsetX: 0, - // shadowOffsetY: 0, - // fontSize:'50' - // shadowColor: '#626262', - // shadowBlur: 8, - // shadowOffsetX: -1, - // shadowOffsetY: 3 - }, - unselected: { - shadowColor: '' - } - }, - // 节点标签样式 - nodeLabelCfg: { - positions: 'center', - style: { - fill: '#000' - } - }, - // 连线样式 - edgeStyle: { - default: { - stroke: '#A3B1BF', - lineWidth: 2, - strokeOpacity: 0.92, - lineAppendWidth: 10 - // endArrow: true - }, - active: { - shadowColor: 'red', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - inactive: { - shadowColor: '' - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - unselected: { - shadowColor: '' - } - }, - // 锚点样式 - anchorStyle: { - default: { - r: 3, - symbol: 'circle', - lineWidth: 1, - fill: '#FFFFFF', - fillOpacity: 1, - stroke: '#096DD9', - strokeOpacity: 1, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 0.3, - strokeOpacity: 0.5 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 1, - strokeOpacity: 1 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - // 锚点背景样式 - anchorBgStyle: { - default: { - r: 10, - symbol: 'circle', - fill: '#1890FF', - fillOpacity: 0, - stroke: '#1890FF', - strokeOpacity: 0, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 1, - strokeOpacity: 1 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 0.3, - strokeOpacity: 0.5 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - - - nodeActivedOutterStyle: { lineWidth: 0 }, - groupSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - nodeSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - edgeActivedStyle: { stroke: '#1890FF', strokeOpacity: .92 }, - nodeActivedStyle: { fill: '#F3F9FF', stroke: '#1890FF' }, - groupActivedStyle: { stroke: '#1890FF' }, - edgeSelectedStyle: { lineWidth: 2, strokeOpacity: .92, stroke: '#A3B1BF' }, - nodeSelectedStyle: { fill: '#F3F9FF', stroke: '#1890FF', fillOpacity: .4 }, - groupSelectedStyle: { stroke: '#1890FF', fillOpacity: .92 }, - - groupBackgroundPadding: [40, 10, 10, 10], - groupLabelOffsetX: 10, - groupLabelOffsetY: 10, - edgeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - edgeLabelRectPadding: 4, - edgeLabelRectStyle: { fill: 'white' }, - nodeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - groupStyle: { stroke: '#CED4D9', radius: 4 }, - groupLabelStyle: { fill: '#666', textAlign: 'left', textBaseline: 'top' }, - multiSelectRectStyle: { fill: '#1890FF', fillOpacity: .08, stroke: '#1890FF', opacity: .1 }, - dragNodeHoverToGroupStyle: { stroke: '#1890FF', lineWidth: 2 }, - dragNodeLeaveFromGroupStyle: { stroke: '#BAE7FF', lineWidth: 2 }, - anchorPointStyle: { radius: 3.5, fill: '#fff', stroke: '#1890FF', lineAppendWidth: 12 }, - anchorHotsoptStyle: { radius: 12, fill: '#1890FF', fillOpacity: .25 }, - anchorHotsoptActivedStyle: { radius: 14 }, - anchorPointHoverStyle: { radius: 4, fill: '#1890FF', fillOpacity: 1, stroke: '#1890FF' }, - nodeControlPointStyle: { radius: 4, fill: '#fff', shadowBlur: 4, shadowColor: '#666' }, - edgeControlPointStyle: { radius: 6, symbol: 'square', lineAppendWidth: 6, fillOpacity: 0, strokeOpacity: 0 }, - nodeSelectedBoxStyle: { stroke: '#C2C2C2' }, - cursor: { - panningCanvas: '-webkit-grabbing', - beforePanCanvas: '-webkit-grab', - hoverNode: 'move', - hoverEffectiveAnchor: 'crosshair', - hoverEdge: 'default', - hoverGroup: 'move', - hoverUnEffectiveAnchor: 'default', - hoverEdgeControllPoint: 'crosshair', - multiSelect: 'crosshair' - }, - nodeDelegationStyle: { - stroke: '#1890FF', - fill: '#1890FF', - fillOpacity: .08, - lineDash: [4, 4], - radius: 4, - lineWidth: 1 - }, - edgeDelegationStyle: { stroke: '#1890FF', lineDash: [4, 4], lineWidth: 1 } -} diff --git a/src/views/custom-query/topo/top/theme/index.js b/src/views/custom-query/topo/top/theme/index.js deleted file mode 100644 index 02e514a..0000000 --- a/src/views/custom-query/topo/top/theme/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: 编辑器主题样式 - 节点、连线的预设样式 - */ - -import defaultStyle from './default-style' -import darkStyle from './dark-style' -import officeStyle from './office-style' - -export default { - defaultStyle, - darkStyle, - officeStyle -} diff --git a/src/views/custom-query/topo/top/theme/office-style.js b/src/views/custom-query/topo/top/theme/office-style.js deleted file mode 100644 index b1e21a7..0000000 --- a/src/views/custom-query/topo/top/theme/office-style.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @author: clay - * @data: 2019/11/21 - * @description: office style - */ - -export default { - // 节点样式 - nodeStyle: { - default: { - stroke: '#CED4D9', - fill: '#FFFFFF', - shadowOffsetX: 0, - shadowOffsetY: 4, - shadowBlur: 10, - shadowColor: 'rgba(13, 26, 38, 0.08)', - lineWidth: 1, - radius: 4, - strokeOpacity: 0.7 - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 4, - shadowOffsetX: 1, - shadowOffsetY: 1 - // shadowColor: '#626262', - // shadowBlur: 8, - // shadowOffsetX: -1, - // shadowOffsetY: 3 - }, - unselected: { - shadowColor: '' - } - }, - // 节点标签样式 - nodeLabelCfg: { - positions: 'center', - style: { - fill: '#000' - } - }, - // 连线样式 - edgeStyle: { - default: { - stroke: '#41c23a', - lineWidth: 2, - strokeOpacity: 0.92, - lineAppendWidth: 10 - // endArrow: true - }, - active: { - shadowColor: 'red', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - inactive: { - shadowColor: '' - }, - selected: { - shadowColor: '#ff240b', - shadowBlur: 4, - shadowOffsetX: 0, - shadowOffsetY: 0 - }, - unselected: { - shadowColor: '' - } - }, - // 锚点样式 - anchorStyle: { - default: { - radius: 3, - symbol: 'circle', - fill: '#FFFFFF', - fillOpacity: 0, - stroke: '#1890FF', - strokeOpacity: 0, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 1, - strokeOpacity: 1 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 1, - strokeOpacity: 1 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - // 锚点背景样式 - anchorBgStyle: { - default: { - radius: 10, - symbol: 'circle', - fill: '#1890FF', - fillOpacity: 0, - stroke: '#1890FF', - strokeOpacity: 0, - cursor: 'crosshair' - }, - hover: { - fillOpacity: 1, - strokeOpacity: 1 - }, - unhover: { - fillOpacity: 0, - strokeOpacity: 0 - }, - active: { - fillOpacity: 0.3, - strokeOpacity: 0.5 - }, - inactive: { - fillOpacity: 0, - strokeOpacity: 0 - } - }, - - - nodeActivedOutterStyle: { lineWidth: 0 }, - groupSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - nodeSelectedOutterStyle: { stroke: '#E0F0FF', lineWidth: 2 }, - edgeActivedStyle: { stroke: '#1890FF', strokeOpacity: .92 }, - nodeActivedStyle: { fill: '#F3F9FF', stroke: '#1890FF' }, - groupActivedStyle: { stroke: '#1890FF' }, - edgeSelectedStyle: { lineWidth: 2, strokeOpacity: .92, stroke: '#A3B1BF' }, - nodeSelectedStyle: { fill: '#F3F9FF', stroke: '#1890FF', fillOpacity: .4 }, - groupSelectedStyle: { stroke: '#1890FF', fillOpacity: .92 }, - - groupBackgroundPadding: [40, 10, 10, 10], - groupLabelOffsetX: 10, - groupLabelOffsetY: 10, - edgeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - edgeLabelRectPadding: 4, - edgeLabelRectStyle: { fill: 'white' }, - nodeLabelStyle: { fill: '#666', textAlign: 'center', textBaseline: 'middle' }, - groupStyle: { stroke: '#CED4D9', radius: 4 }, - groupLabelStyle: { fill: '#666', textAlign: 'left', textBaseline: 'top' }, - multiSelectRectStyle: { fill: '#1890FF', fillOpacity: .08, stroke: '#1890FF', opacity: .1 }, - dragNodeHoverToGroupStyle: { stroke: '#1890FF', lineWidth: 2 }, - dragNodeLeaveFromGroupStyle: { stroke: '#BAE7FF', lineWidth: 2 }, - anchorPointStyle: { radius: 3.5, fill: '#fff', stroke: '#1890FF', lineAppendWidth: 12 }, - anchorHotsoptStyle: { radius: 12, fill: '#1890FF', fillOpacity: .25 }, - anchorHotsoptActivedStyle: { radius: 14 }, - anchorPointHoverStyle: { radius: 4, fill: '#1890FF', fillOpacity: 1, stroke: '#1890FF' }, - nodeControlPointStyle: { radius: 4, fill: '#fff', shadowBlur: 4, shadowColor: '#666' }, - edgeControlPointStyle: { radius: 6, symbol: 'square', lineAppendWidth: 6, fillOpacity: 0, strokeOpacity: 0 }, - nodeSelectedBoxStyle: { stroke: '#C2C2C2' }, - cursor: { - panningCanvas: '-webkit-grabbing', - beforePanCanvas: '-webkit-grab', - hoverNode: 'move', - hoverEffectiveAnchor: 'crosshair', - hoverEdge: 'default', - hoverGroup: 'move', - hoverUnEffectiveAnchor: 'default', - hoverEdgeControllPoint: 'crosshair', - multiSelect: 'crosshair' - }, - nodeDelegationStyle: { - stroke: '#1890FF', - fill: '#1890FF', - fillOpacity: .08, - lineDash: [4, 4], - radius: 4, - lineWidth: 1 - }, - edgeDelegationStyle: { stroke: '#1890FF', lineDash: [4, 4], lineWidth: 1 } -} diff --git a/src/views/custom-query/topo/top/toolbar-edit.vue b/src/views/custom-query/topo/top/toolbar-edit.vue deleted file mode 100644 index 57c9163..0000000 --- a/src/views/custom-query/topo/top/toolbar-edit.vue +++ /dev/null @@ -1,217 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/toolbar-preview.vue b/src/views/custom-query/topo/top/toolbar-preview.vue deleted file mode 100644 index dadfb70..0000000 --- a/src/views/custom-query/topo/top/toolbar-preview.vue +++ /dev/null @@ -1,183 +0,0 @@ - - - - - diff --git a/src/views/custom-query/topo/top/topology.vue b/src/views/custom-query/topo/top/topology.vue deleted file mode 100644 index bbf7134..0000000 --- a/src/views/custom-query/topo/top/topology.vue +++ /dev/null @@ -1,1808 +0,0 @@ - - - - - - diff --git a/src/views/custom-query/topo/topologyDesign.vue b/src/views/custom-query/topo/topologyDesign.vue deleted file mode 100644 index aedb4b9..0000000 --- a/src/views/custom-query/topo/topologyDesign.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - diff --git a/src/views/custom-query/topo/utils/anchor/draw_mark.js b/src/views/custom-query/topo/utils/anchor/draw_mark.js deleted file mode 100644 index ee23076..0000000 --- a/src/views/custom-query/topo/utils/anchor/draw_mark.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: 画锚点 - */ - - import theme from '@/views/custom-query/topo/top/theme' -export default function(cfg, group) { - const themeStyle = theme.defaultStyle // todo...先使用默认主题,后期可能增加其它风格的主体 - let { anchorPoints, width, height, id } = cfg - if (anchorPoints && anchorPoints.length) { - for (let i = 0, len = anchorPoints.length; i < len; i++) { - let [x, y] = anchorPoints[i] - // 计算Marker中心点坐标 - let anchorX = x * width - let anchorY = y * height - // 添加锚点背景 - let anchorBgShape = group.addShape('marker', { - id: id + '_anchor_bg_' + i, - attrs: { - name: 'anchorBg', - x: anchorX, - y: anchorY, - // 锚点默认样式 - ...themeStyle.anchorBgStyle.default - }, - draggable: false, - name: 'markerBg-shape' - }) - // 添加锚点Marker形状 - let anchorShape = group.addShape('marker', { - id: id + '_anchor_' + i, - attrs: { - name: 'anchor', - x: anchorX, - y: anchorY, - // 锚点默认样式 - ...themeStyle.anchorStyle.default - }, - draggable: false, - name: 'marker-shape' - }) - - anchorShape.on('mouseenter', function() { - anchorBgShape.attr({ - ...themeStyle.anchorBgStyle.active - }) - }) - anchorShape.on('mouseleave', function() { - anchorBgShape.attr({ - ...themeStyle.anchorBgStyle.inactive - }) - }) - } - } -} diff --git a/src/views/custom-query/topo/utils/anchor/index.js b/src/views/custom-query/topo/utils/anchor/index.js deleted file mode 100644 index e272fab..0000000 --- a/src/views/custom-query/topo/utils/anchor/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: anchor - */ - -import setState from './set-state' -import drawMark from './draw_mark' - -export default { - setState, - drawMark, -} diff --git a/src/views/custom-query/topo/utils/anchor/set-state.js b/src/views/custom-query/topo/utils/anchor/set-state.js deleted file mode 100644 index e1ea5f8..0000000 --- a/src/views/custom-query/topo/utils/anchor/set-state.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: set anchor state - */ -import theme from '@/views/custom-query/topo/top/theme' - -export default function (name, value, item) { - const themeStyle = theme.defaultStyle - if (name === 'hover') { - let group = item.getContainer() - let children = group.get('children') - for (let i = 0, len = children.length; i < len; i++) { - let child = children[i] - // 处理锚点状态 - if (child.attrs.name === 'anchorBg') { - if (value) { - child.attr(themeStyle.anchorStyle.hover) - } else { - child.attr(themeStyle.anchorStyle.unhover) - } - } - } - } -} diff --git a/src/views/custom-query/topo/utils/anchor/update.js b/src/views/custom-query/topo/utils/anchor/update.js deleted file mode 100644 index 5de0430..0000000 --- a/src/views/custom-query/topo/utils/anchor/update.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: update anchor - */ - -export default function(cfg, group) { - let { anchorPoints, width, height, id } = cfg - if (anchorPoints && anchorPoints.length) { - for (let i = 0, len = anchorPoints.length; i < len; i++) { - let [x, y] = anchorPoints[i] - // 计算Marker中心点坐标 - let originX = -width / 2 - let originY = -height / 2 - let anchorX = x * width + originX - let anchorY = y * height + originY - // 锚点背景 - let anchorBgShape = group.findById(id + '_anchor_bg_' + i) - // 锚点 - let anchorShape = group.findById(id + '_anchor_' + i) - anchorBgShape.attr({ - x: anchorX, - y: anchorY - }) - anchorShape.attr({ - x: anchorX, - y: anchorY - }) - } - } -} \ No newline at end of file diff --git a/src/views/custom-query/topo/utils/collapse/index.js b/src/views/custom-query/topo/utils/collapse/index.js deleted file mode 100644 index d43dc28..0000000 --- a/src/views/custom-query/topo/utils/collapse/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @author: clay - * @data: 2021/5/11 17:28 - * @email: clay@hchyun.com - * @description: node - */ -import setState from './set-state' - -export default { - setState -} diff --git a/src/views/custom-query/topo/utils/collapse/set-state.js b/src/views/custom-query/topo/utils/collapse/set-state.js deleted file mode 100644 index 67e19f5..0000000 --- a/src/views/custom-query/topo/utils/collapse/set-state.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @author: clay - * @data: 2021/5/11 17:28 - * @email: clay@hchyun.com - * @description: node 节点收缩和放大 - */ -export default function(e){ - const { - graph - } = this; - const item = e.item; - const shape = e.shape; - if (!item) { - return; - } - - //收缩 - if (shape.get("name") === "collapse") { - graph.updateItem(item, { - collapsed: true, - size: [300, 50], - }); - setTimeout(() => graph.layout(), 100); - //展开 - } else if (shape.get("name") === "expand") { - graph.updateItem(item, { - collapsed: false, - size: [300, 500], - }); - setTimeout(() => graph.layout(), 100); - } -} diff --git a/src/views/custom-query/topo/utils/date.js b/src/views/custom-query/topo/utils/date.js deleted file mode 100644 index 92dbc30..0000000 --- a/src/views/custom-query/topo/utils/date.js +++ /dev/null @@ -1,106 +0,0 @@ -//时间转换为String类型 -const simpleDateFormat=(pattern)=> { - const fmt = new Object(); - fmt.pattern = pattern; - fmt.parse = function (source) { - try { - return new Date(source); - } catch (e) { - console.log("字符串 " + source + " 转时间格式失败!"); - return null; - } - }; - fmt.format = function (date) { - if (typeof (date) == "undefined" || date == null || date == "") { - return ""; - } - try { - date = new Date(date); - } catch (e) { - console.log("时间 " + date + " 格式化失败!"); - return ""; - } - let strTime = this.pattern;//时间表达式的正则 - - const o = { - "M+": date.getMonth() + 1, //月份 - "d+": date.getDate(), //日 - "H+": date.getHours(), //小时 - "m+": date.getMinutes(), //分 - "s+": date.getSeconds(), //秒 - "q+": Math.floor((date.getMonth() + 3) / 3), //季度 - "S": date.getMilliseconds() //毫秒 - }; - if (/(y+)/.test(strTime)) { - strTime = strTime - .replace(RegExp.$1, (date.getFullYear() + "") - .substr(4 - RegExp.$1.length)); - } - for (const k in o) { - if (new RegExp("(" + k + ")").test(strTime)) { - strTime = strTime.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); - } - } - return strTime; - }; - return fmt; -} - -//用于一个函数有多个时间格式转换 -export const simpleDateMoreFormat=(date, formatStr) =>{ - console.log(date,formatStr) - const fmt = simpleDateFormat(formatStr); - date = fmt.parse(date) - return fmt.format(date) -} - -//时间格式化为yyyy.MM -const simpleDateFormatByDot=(date) =>{ - const fmt = simpleDateFormat("yyyy.MM"); - date = fmt.parse(date) - return fmt.format(date) -} - -//时间格式化为yyyy-MM -const simpleDateFormatByLine=(date) =>{ - const fmt = simpleDateFormat("yyyy-MM"); - date = fmt.parse(date) - return fmt.format(date) -} - -//时间格式化为yyyy-MM-dd -const simpleDateFormatByMoreLine=(date) =>{ - const fmt = simpleDateFormat("yyyy-MM-dd"); - date = fmt.parse(date) - return fmt.format(date) -} - -//用于list表里每条记录中的startDate,endDate,格式化为yyyy.MM -const converListDateByDot=(list) =>{ - for (const item of list) { - item.startDate = simpleDateFormatByDot(item.startDate); - item.endDate = simpleDateFormatByDot(item.endDate); - } -} - -//用于data.startDate,data.endDate,格式化为yyyy-MM -const converListDateByLine=(date) =>{ - data.startDate = simpleDateFormatByLine(data.startDate); - data.endDate = simpleDateFormatByLine(data.endDate); -} - - -export default { - simpleDateFormat, - simpleDateMoreFormat, - simpleDateFormatByDot, - simpleDateFormatByLine, - simpleDateFormatByMoreLine, - converListDateByDot, - converListDateByLine -} - - - - - diff --git a/src/views/custom-query/topo/utils/edge/index.js b/src/views/custom-query/topo/utils/edge/index.js deleted file mode 100644 index 8002373..0000000 --- a/src/views/custom-query/topo/utils/edge/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: edge - */ - -import setState from './set-state' - -export default { - setState -} diff --git a/src/views/custom-query/topo/utils/edge/set-state.js b/src/views/custom-query/topo/utils/edge/set-state.js deleted file mode 100644 index fde37f7..0000000 --- a/src/views/custom-query/topo/utils/edge/set-state.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: set edge state - */ - -import theme from '@/views/custom-query/topo/top/theme' - -export default function(name, value, item) { - const group = item.getContainer() - const shape = group.get('children')[0] // 顺序根据 draw 时确定 - const themeStyle = theme.defaultStyle // todo...先使用默认主题,后期可能增加其它风格的主体 - if (name === 'selected') { - if (value) { - shape.attr(themeStyle.edgeStyle.selected) - } else { - shape.attr(themeStyle.edgeStyle.unselected) - } - } -} diff --git a/src/views/custom-query/topo/utils/index.js b/src/views/custom-query/topo/utils/index.js deleted file mode 100644 index 8cd64c9..0000000 --- a/src/views/custom-query/topo/utils/index.js +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Created by clay on 2019/10/14 - * Description: common utils - */ - -/** - * This is just a simple version of deep copy - * Has a lot of edge cases bug - * If you want to use a perfect deep copy, use lodash's _.cloneDeep - * @param {Object} source - * @returns {Object} targetObj - */ -const deepClone = function(source) { - if (!source && typeof source !== 'object') { - throw new Error('error arguments: deepClone') - } - let targetObj = source.constructor === Array ? [] : {} - Object.keys(source).forEach(key => { - if (source[key] && typeof source[key] === 'object') { - targetObj[key] = deepClone(source[key]) - } else { - targetObj[key] = source[key] - } - }) - return targetObj -} - -/** - * Randomly extract one or more elements from an array - * If you want to use a perfect solution, use lodash's _.sample or _.sampleSize - * @param {Array} arr - * @param {number} count - * @returns {Array} arr - */ -const getRandomArrayElements = function(arr, count = 1) { - if (count > arr.length) { - throw new Error('error arguments: count is greater than length of array') - } - let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index - while (i-- > min) { - index = Math.floor((i + 1) * Math.random()) - temp = shuffled[index] - shuffled[index] = shuffled[i] - shuffled[i] = temp - } - return shuffled.slice(min) -} - -/** - * @author: clay - * @data: 2019/08/15 - * @description: graph utils - */ - -import node from './node' -import anchor from './anchor' -import edge from './edge' -import collapse from './collapse' - -/** - * 比较两个对象的内容是否相同(两个对象的键值都相同) - * @param obj1 - * @param obj2 - * @returns {*} - */ -const isObjectValueEqual = function(obj1, obj2) { - let o1 = obj1 instanceof Object - let o2 = obj2 instanceof Object - // 不是对象的情况 - if (!o1 || !o2) { - return obj1 === obj2 - } - // 对象的属性(key值)个数不相等 - if (Object.keys(obj1).length !== Object.keys(obj2).length) { - return false - } - // 判断每个属性(如果属性值也是对象则需要递归) - for (let attr in obj1) { - let t1 = obj1[attr] instanceof Object - let t2 = obj2[attr] instanceof Object - if (t1 && t2) { - return isObjectValueEqual(obj1[attr], obj2[attr]) - } else if (obj1[attr] !== obj2[attr]) { - return false - } - } - return true -} - - -/** - * 生成uuid算法,碰撞率低于1/2^^122 - * @returns {string} - */ -const generateUUID = function() { - let d = new Date().getTime() - // x 是 0-9 或 a-f 范围内的一个32位十六进制数 - let uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { - let r = (d + Math.random() * 16) % 16 | 0 - d = Math.floor(d / 16) - return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16) - }) - return uuid -} - -export default { - node, - anchor, - edge, - collapse, - // 通用工具类函数 - isObjectValueEqual, - generateUUID, - deepClone, - getRandomArrayElements -} - diff --git a/src/views/custom-query/topo/utils/node/index.js b/src/views/custom-query/topo/utils/node/index.js deleted file mode 100644 index 61e5741..0000000 --- a/src/views/custom-query/topo/utils/node/index.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: node - */ - -import setState from './set-state' - -export default { - setState -} diff --git a/src/views/custom-query/topo/utils/node/set-state.js b/src/views/custom-query/topo/utils/node/set-state.js deleted file mode 100644 index b489c94..0000000 --- a/src/views/custom-query/topo/utils/node/set-state.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @author: clay - * @data: 2019/08/15 - * @description: set node state - */ - -import theme from '@/views/custom-query/topo/top/theme' - -export default function(name, value, item) { - const group = item.getContainer() - const themeStyle = theme.defaultStyle // todo...先使用默认主题,后期可能增加其它风格的主体 - let children = group.get('children') - for (let i = 0; i < children.length; i++) { - let child = children[i] - //判断是否为er图的外围,是则改变样式 - if (child.attrs.name === 'border') { - if (name === 'selected') { - if (value) { - child.attr(themeStyle.nodeStyle.selected) - } else { - child.attr(themeStyle.nodeStyle.default) - } - } - } - } -} diff --git a/src/views/rapid/gen/basicInfoForm.vue b/src/views/rapid/gen/basicInfoForm.vue deleted file mode 100644 index de9e4fd..0000000 --- a/src/views/rapid/gen/basicInfoForm.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/rapid/gen/editTable.vue b/src/views/rapid/gen/editTable.vue deleted file mode 100644 index ab9a19d..0000000 --- a/src/views/rapid/gen/editTable.vue +++ /dev/null @@ -1,234 +0,0 @@ - - - - - diff --git a/src/views/rapid/gen/importTable.vue b/src/views/rapid/gen/importTable.vue deleted file mode 100644 index a8b34e1..0000000 --- a/src/views/rapid/gen/importTable.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - diff --git a/src/views/rapid/gen/index.vue b/src/views/rapid/gen/index.vue deleted file mode 100644 index d9bce77..0000000 --- a/src/views/rapid/gen/index.vue +++ /dev/null @@ -1,362 +0,0 @@ - - - diff --git a/src/views/rapid/gen/tableInfo.vue b/src/views/rapid/gen/tableInfo.vue deleted file mode 100644 index cd78788..0000000 --- a/src/views/rapid/gen/tableInfo.vue +++ /dev/null @@ -1,210 +0,0 @@ - - - - - diff --git a/src/views/rapid/regular/index.vue b/src/views/rapid/regular/index.vue deleted file mode 100644 index afa5ebc..0000000 --- a/src/views/rapid/regular/index.vue +++ /dev/null @@ -1,302 +0,0 @@ - - - diff --git a/src/views/rapid/source/index.vue b/src/views/rapid/source/index.vue deleted file mode 100644 index 5c53de6..0000000 --- a/src/views/rapid/source/index.vue +++ /dev/null @@ -1,380 +0,0 @@ - - - - - diff --git a/src/views/steps/step/Step1.vue b/src/views/steps/step/Step1.vue deleted file mode 100644 index 62a314c..0000000 --- a/src/views/steps/step/Step1.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/src/views/steps/step/Step2.vue b/src/views/steps/step/Step2.vue deleted file mode 100644 index 9cbe328..0000000 --- a/src/views/steps/step/Step2.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/src/views/steps/step/Step3.vue b/src/views/steps/step/Step3.vue deleted file mode 100644 index 62a314c..0000000 --- a/src/views/steps/step/Step3.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/src/views/steps/step/Step4.vue b/src/views/steps/step/Step4.vue deleted file mode 100644 index 62a314c..0000000 --- a/src/views/steps/step/Step4.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/src/views/steps/step/Step5.vue b/src/views/steps/step/Step5.vue deleted file mode 100644 index 21f837e..0000000 --- a/src/views/steps/step/Step5.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/src/views/steps/step/index.vue b/src/views/steps/step/index.vue deleted file mode 100644 index 111cea2..0000000 --- a/src/views/steps/step/index.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - - - \ No newline at end of file