From c8c1bec0f16c4d88209ccbefaa6f6437abb4e28b Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Mon, 7 Nov 2022 17:28:54 +0800
Subject: [PATCH 01/44] =?UTF-8?q?fix:=20=E6=96=87=E4=BB=B6=E5=90=8D?=
=?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/components/canvas/DeCanvas.vue | 2 +-
.../canvas/components/editor/DeEditor.vue | 2 +-
.../canvas/components/editor/EditBar.vue | 4 +-
.../editor/{fieldsList.vue => FieldsList.vue} | 0
.../canvas/components/editor/index.vue | 2 +-
frontend/src/components/canvas/index.vue | 2 +-
.../components/cron/{cron.vue => Cron.vue} | 12 ++---
.../src/components/dataease/DeOutWidget.vue | 1 -
frontend/src/components/gridTable/index.vue | 2 +-
.../src/components/widget/deWidget/DeTabs.vue | 4 +-
frontend/src/main.js | 4 +-
.../BackgroundColorSelector.vue | 0
.../LegendSelector.vue | 0
.../LegendSelectorAntV.vue | 0
.../MarginSelector.vue | 0
.../SplitSelector.vue | 0
.../SplitSelectorAntV.vue | 0
.../TitleSelector.vue | 0
.../TitleSelectorAntV.vue | 0
.../XAxisSelector.vue | 0
.../XAxisSelectorAntV.vue | 0
.../YAxisExtSelector.vue | 0
.../YAxisExtSelectorAntV.vue | 0
.../YAxisSelector.vue | 0
.../YAxisSelectorAntV.vue | 0
.../dialog/RemarkEditor.vue | 0
.../{drag-item => dragItem}/ChartDragItem.vue | 4 +-
.../DimensionExtItem.vue | 4 +-
.../{drag-item => dragItem}/DimensionItem.vue | 4 +-
.../{drag-item => dragItem}/DrillItem.vue | 4 +-
.../{drag-item => dragItem}/FilterItem.vue | 4 +-
.../{drag-item => dragItem}/QuotaExtItem.vue | 4 +-
.../{drag-item => dragItem}/QuotaItem.vue | 4 +-
.../components/FieldErrorTips.vue | 0
.../{drag-item => dragItem}/utils.js | 0
.../ColorSelector.vue | 0
.../ColorSelectorExt.vue | 0
.../LabelSelector.vue | 0
.../LabelSelectorAntV.vue | 0
.../SizeSelector.vue | 0
.../SizeSelectorAntV.vue | 0
.../SizeSelectorCommon.vue | 0
.../TooltipSelector.vue | 0
.../TooltipSelectorAntV.vue | 0
.../{shape-attr => shapeAttr}/TotalCfg.vue | 0
.../ChartMoveSelector.vue | 0
.../GroupMoveSelector.vue | 0
.../{TreeSelector => treeSelector}/index.vue | 0
.../ValueFormatterEdit.vue | 0
frontend/src/views/chart/group/Group.vue | 4 +-
frontend/src/views/chart/view/ChartEdit.vue | 16 +++----
frontend/src/views/chart/view/ChartStyle.vue | 44 +++++++++----------
frontend/src/views/dataset/add/AddUnion.vue | 2 +-
.../src/views/dataset/add/union/NodeItem.vue | 2 +-
.../src/views/dataset/data/UpdateInfo.vue | 2 +-
.../src/views/dataset/data/UpdateRecords.vue | 2 +-
frontend/src/views/dataset/index.vue | 2 +-
frontend/src/views/nested/menu1/index.vue | 10 -----
.../src/views/nested/menu1/menu1-1/index.vue | 11 -----
.../src/views/nested/menu1/menu1-2/index.vue | 11 -----
.../nested/menu1/menu1-2/menu1-2-1/index.vue | 9 ----
.../nested/menu1/menu1-2/menu1-2-2/index.vue | 9 ----
.../src/views/nested/menu1/menu1-3/index.vue | 9 ----
frontend/src/views/nested/menu2/index.vue | 5 ---
.../PanelBackgroundColorSelector.vue | 2 +-
.../src/views/panel/SubjectSetting/index.vue | 14 +++---
.../views/panel/ViewSelect/multiplexing.vue | 2 +-
.../log/{filterUser.vue => FilterUser.vue} | 2 +-
.../panel/appTemplateMarket/log/index.vue | 2 +-
frontend/src/views/panel/edit/index.vue | 10 ++---
.../src/views/panel/list/AppExportForm.vue | 2 +-
frontend/src/views/panel/list/PanelList.vue | 4 +-
frontend/src/views/panel/list/PanelMain.vue | 2 +-
.../src/views/panel/list/PanelViewShow.vue | 2 +-
frontend/src/views/panel/video/index.vue | 1 -
.../IndexWithDrag.vue} | 0
.../views/system/datasource/ApiAuthConfig.vue | 2 +-
.../system/datasource/DsConfiguration.vue | 2 +-
.../src/views/system/datasource/DsForm.vue | 2 +-
.../src/views/system/datasource/DsMain.vue | 2 +-
.../datasource/{dsTable.vue => DsTable.vue} | 0
.../src/views/system/datasource/DsTree.vue | 2 +-
frontend/src/views/system/datasource/form.vue | 11 -----
frontend/src/views/system/log/FilterUser.vue | 2 +-
.../plugin/{dynamic.vue => Dynamic.vue} | 0
.../views/system/sysParam/BasicSetting.vue | 2 +-
.../system/sysParam/ClusterModeSetting.vue | 2 +-
.../views/system/sysParam/EmailSetting.vue | 2 +-
.../views/system/sysParam/KettleSetting.vue | 2 +-
frontend/src/views/system/task/FilterUser.vue | 2 +-
.../views/system/task/FilterUserRecord.vue | 2 +-
frontend/src/views/system/task/Form.vue | 2 +-
frontend/src/views/system/user/PersonPwd.vue | 2 +-
.../wizard/{index_back.vue => IndexBack.vue} | 4 +-
frontend/src/views/wizard/index.vue | 6 +--
95 files changed, 108 insertions(+), 185 deletions(-)
rename frontend/src/components/canvas/components/editor/{fieldsList.vue => FieldsList.vue} (100%)
rename frontend/src/components/cron/{cron.vue => Cron.vue} (95%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/BackgroundColorSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/LegendSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/LegendSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/MarginSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/SplitSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/SplitSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/TitleSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/TitleSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/XAxisSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/XAxisSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/YAxisExtSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/YAxisExtSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/YAxisSelector.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/YAxisSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{component-style => componentStyle}/dialog/RemarkEditor.vue (100%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/ChartDragItem.vue (98%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/DimensionExtItem.vue (98%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/DimensionItem.vue (98%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/DrillItem.vue (96%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/FilterItem.vue (96%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/QuotaExtItem.vue (99%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/QuotaItem.vue (99%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/components/FieldErrorTips.vue (100%)
rename frontend/src/views/chart/components/{drag-item => dragItem}/utils.js (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/ColorSelector.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/ColorSelectorExt.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/LabelSelector.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/LabelSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/SizeSelector.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/SizeSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/SizeSelectorCommon.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/TooltipSelector.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/TooltipSelectorAntV.vue (100%)
rename frontend/src/views/chart/components/{shape-attr => shapeAttr}/TotalCfg.vue (100%)
rename frontend/src/views/chart/components/{TreeSelector => treeSelector}/ChartMoveSelector.vue (100%)
rename frontend/src/views/chart/components/{TreeSelector => treeSelector}/GroupMoveSelector.vue (100%)
rename frontend/src/views/chart/components/{TreeSelector => treeSelector}/index.vue (100%)
rename frontend/src/views/chart/components/{value-formatter => valueFormatter}/ValueFormatterEdit.vue (100%)
delete mode 100644 frontend/src/views/nested/menu1/index.vue
delete mode 100644 frontend/src/views/nested/menu1/menu1-1/index.vue
delete mode 100644 frontend/src/views/nested/menu1/menu1-2/index.vue
delete mode 100644 frontend/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue
delete mode 100644 frontend/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue
delete mode 100644 frontend/src/views/nested/menu1/menu1-3/index.vue
delete mode 100644 frontend/src/views/nested/menu2/index.vue
rename frontend/src/views/panel/appTemplateMarket/log/{filterUser.vue => FilterUser.vue} (97%)
rename frontend/src/views/panel/{ViewSelect/index-with-drag.vue => viewSelect/IndexWithDrag.vue} (100%)
rename frontend/src/views/system/datasource/{dsTable.vue => DsTable.vue} (100%)
delete mode 100644 frontend/src/views/system/datasource/form.vue
rename frontend/src/views/system/plugin/{dynamic.vue => Dynamic.vue} (100%)
rename frontend/src/views/wizard/{index_back.vue => IndexBack.vue} (98%)
diff --git a/frontend/src/components/canvas/DeCanvas.vue b/frontend/src/components/canvas/DeCanvas.vue
index d9e6d9a767..e954e3fb4c 100644
--- a/frontend/src/components/canvas/DeCanvas.vue
+++ b/frontend/src/components/canvas/DeCanvas.vue
@@ -112,7 +112,7 @@ import toast from '@/components/canvas/utils/toast'
import generateID from '@/components/canvas/utils/generateID'
import ButtonDialog from '@/views/panel/filter/ButtonDialog'
import ButtonResetDialog from '@/views/panel/filter/ButtonResetDialog'
-import FilterDialog from '@/views/panel/filter/filterDialog'
+import FilterDialog from '@/views/panel/filter/FilterDialog'
export default {
components: { FilterDialog, ButtonResetDialog, ButtonDialog, DeEditor },
diff --git a/frontend/src/components/canvas/components/editor/DeEditor.vue b/frontend/src/components/canvas/components/editor/DeEditor.vue
index d46ec9c9e9..cf74a1599e 100644
--- a/frontend/src/components/canvas/components/editor/DeEditor.vue
+++ b/frontend/src/components/canvas/components/editor/DeEditor.vue
@@ -162,7 +162,7 @@ import UserViewDialog from '@/components/canvas/customComponent/UserViewDialog'
import DeOutWidget from '@/components/dataease/DeOutWidget'
import DragShadow from '@/components/deDrag/Shadow'
import bus from '@/utils/bus'
-import LinkJumpSet from '@/views/panel/LinkJumpSet'
+import LinkJumpSet from '@/views/panel/linkJumpSet'
import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch } from '@/utils/conditionUtil'
// 挤占式画布
import _ from 'lodash'
diff --git a/frontend/src/components/canvas/components/editor/EditBar.vue b/frontend/src/components/canvas/components/editor/EditBar.vue
index b7df7c6e36..ac4ca871e9 100644
--- a/frontend/src/components/canvas/components/editor/EditBar.vue
+++ b/frontend/src/components/canvas/components/editor/EditBar.vue
@@ -182,8 +182,8 @@ import bus from '@/utils/bus'
import SettingMenu from '@/components/canvas/components/editor/SettingMenu'
import LinkageField from '@/components/canvas/components/editor/LinkageField'
import toast from '@/components/canvas/utils/toast'
-import FieldsList from '@/components/canvas/components/editor/fieldsList'
-import LinkJumpSet from '@/views/panel/LinkJumpSet'
+import FieldsList from '@/components/canvas/components/editor/FieldsList'
+import LinkJumpSet from '@/views/panel/linkJumpSet'
import Background from '@/views/background/index'
export default {
diff --git a/frontend/src/components/canvas/components/editor/fieldsList.vue b/frontend/src/components/canvas/components/editor/FieldsList.vue
similarity index 100%
rename from frontend/src/components/canvas/components/editor/fieldsList.vue
rename to frontend/src/components/canvas/components/editor/FieldsList.vue
diff --git a/frontend/src/components/canvas/components/editor/index.vue b/frontend/src/components/canvas/components/editor/index.vue
index 76db58cf1c..913e10f2e1 100644
--- a/frontend/src/components/canvas/components/editor/index.vue
+++ b/frontend/src/components/canvas/components/editor/index.vue
@@ -231,7 +231,7 @@ import UserViewDialog from '@/components/canvas/customComponent/UserViewDialog'
import DeOutWidget from '@/components/dataease/DeOutWidget'
import DragShadow from '@/components/deDrag/shadow'
import bus from '@/utils/bus'
-import LinkJumpSet from '@/views/panel/LinkJumpSet'
+import LinkJumpSet from '@/views/panel/linkJumpSet'
import { buildFilterMap, buildViewKeyMap, formatCondition, valueValid, viewIdMatch } from '@/utils/conditionUtil'
// 挤占式画布
import _ from 'lodash'
diff --git a/frontend/src/components/canvas/index.vue b/frontend/src/components/canvas/index.vue
index d53a0011e9..e2e06ddf5e 100644
--- a/frontend/src/components/canvas/index.vue
+++ b/frontend/src/components/canvas/index.vue
@@ -19,7 +19,7 @@
-
-
diff --git a/frontend/src/views/system/log/FilterUser.vue b/frontend/src/views/system/log/FilterUser.vue
index 494e64d8b6..2a3235a6b7 100644
--- a/frontend/src/views/system/log/FilterUser.vue
+++ b/frontend/src/views/system/log/FilterUser.vue
@@ -88,7 +88,7 @@
import { dateFormat } from '@/views/system/task/options.js'
import { opTypes } from '@/api/system/log'
import { post } from '@/api/dataset/dataset'
-import DeDatePick from '@/components/deCustomCm/deDatePick.vue'
+import DeDatePick from '@/components/deCustomCm/DeDatePick.vue'
export default {
components: {
DeDatePick
diff --git a/frontend/src/views/system/plugin/dynamic.vue b/frontend/src/views/system/plugin/Dynamic.vue
similarity index 100%
rename from frontend/src/views/system/plugin/dynamic.vue
rename to frontend/src/views/system/plugin/Dynamic.vue
diff --git a/frontend/src/views/system/sysParam/BasicSetting.vue b/frontend/src/views/system/sysParam/BasicSetting.vue
index e555dd783e..8f1cfa19e5 100644
--- a/frontend/src/views/system/sysParam/BasicSetting.vue
+++ b/frontend/src/views/system/sysParam/BasicSetting.vue
@@ -290,7 +290,7 @@ export default {
if (res.success && res.data) {
this.loginTypes.push(3)
}
- }),
+ })
wecomStatus().then(res => {
if (res.success && res.data) {
this.loginTypes.push(4)
diff --git a/frontend/src/views/system/sysParam/ClusterModeSetting.vue b/frontend/src/views/system/sysParam/ClusterModeSetting.vue
index f3ac3b02ca..8db92418eb 100644
--- a/frontend/src/views/system/sysParam/ClusterModeSetting.vue
+++ b/frontend/src/views/system/sysParam/ClusterModeSetting.vue
@@ -184,7 +184,7 @@ import { engineInfo, validate, save } from '@/api/system/engine'
import i18n from '@/lang'
import operator from './Operator'
import msgCfm from '@/components/msgCfm'
-import dePwd from '@/components/deCustomCm/dePwd.vue'
+import dePwd from '@/components/deCustomCm/DePwd.vue'
export default {
name: 'ClusterMode',
components: {
diff --git a/frontend/src/views/system/sysParam/EmailSetting.vue b/frontend/src/views/system/sysParam/EmailSetting.vue
index 8518980f16..59a5a818d6 100644
--- a/frontend/src/views/system/sysParam/EmailSetting.vue
+++ b/frontend/src/views/system/sysParam/EmailSetting.vue
@@ -131,7 +131,7 @@
import { emailInfo, updateInfo, validate } from '@/api/system/email'
import operator from './Operator'
import msgCfm from '@/components/msgCfm'
-import dePwd from '@/components/deCustomCm/dePwd.vue'
+import dePwd from '@/components/deCustomCm/DePwd.vue'
const list = ['host', 'port', 'account', 'password', 'ssl', 'tls', '', 'recipient']
export default {
name: 'EmailSetting',
diff --git a/frontend/src/views/system/sysParam/KettleSetting.vue b/frontend/src/views/system/sysParam/KettleSetting.vue
index 9fd2a18fb0..e8463456f4 100644
--- a/frontend/src/views/system/sysParam/KettleSetting.vue
+++ b/frontend/src/views/system/sysParam/KettleSetting.vue
@@ -161,7 +161,7 @@ import {
validateById
} from '@/api/system/kettle'
import GridTable from '@/components/gridTable/index.vue'
-import dePwd from '@/components/deCustomCm/dePwd.vue'
+import dePwd from '@/components/deCustomCm/DePwd.vue'
import msgCfm from '@/components/msgCfm'
export default {
diff --git a/frontend/src/views/system/task/FilterUser.vue b/frontend/src/views/system/task/FilterUser.vue
index b57dd9ac08..65fc8d8d2c 100644
--- a/frontend/src/views/system/task/FilterUser.vue
+++ b/frontend/src/views/system/task/FilterUser.vue
@@ -145,7 +145,7 @@
+
+
diff --git a/frontend/src/components/widget/deWidget/inputStyleMixin.js b/frontend/src/components/widget/deWidget/inputStyleMixin.js
index 0c8c2c93e4..5efdbd95d4 100644
--- a/frontend/src/components/widget/deWidget/inputStyleMixin.js
+++ b/frontend/src/components/widget/deWidget/inputStyleMixin.js
@@ -58,7 +58,7 @@ export default {
mounted() {
if (!this.isFilterComponent) return
this.typeTransform().forEach(item => {
- const nodeCache = this.$refs.deOutWidget.$refs[item].$el.querySelector('.el-input__inner') || this.$refs.deOutWidget.$refs[item].$el
+ const nodeCache = this.$refs.deOutWidget?.$refs[item].$el.querySelector('.el-input__inner') || this.$refs.deOutWidget.$refs[item].$el
this.styleAttrs.forEach(ele => {
nodeCache.style[this.attrsMap[ele]] = this.element.style[ele]
this[this.element.serviceName] && this[this.element.serviceName](this.selectRange(item), ele, this.element.style[ele])
@@ -70,7 +70,7 @@ export default {
let nodeCache = ''
this.styleAttrs.forEach(ele => {
if (!nodeCache) {
- nodeCache = this.$refs.deOutWidget.$refs[type].$el.querySelector('.el-input__inner') || this.$refs.deOutWidget.$refs[type].$el
+ nodeCache = this.$refs.deOutWidget?.$refs[type].$el.querySelector('.el-input__inner') || this.$refs.deOutWidget.$refs[type].$el
}
nodeCache.style[this.attrsMap[ele]] = newValue[ele]
this[this.element.serviceName] && this[this.element.serviceName](this.selectRange(type), ele, newValue[ele])
diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js
index 37b9f1aed1..ab85919e2c 100644
--- a/frontend/src/lang/en.js
+++ b/frontend/src/lang/en.js
@@ -915,6 +915,7 @@ export default {
password_input_error: 'Original password input error'
},
chart: {
+ suspension: 'Suspension',
chart_background: 'Component background',
solid_color: 'Solid color',
split_gradient: 'Split gradient',
diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js
index c08143f472..d62580b15b 100644
--- a/frontend/src/lang/tw.js
+++ b/frontend/src/lang/tw.js
@@ -915,6 +915,7 @@ export default {
password_input_error: '原始密碼輸入錯誤'
},
chart: {
+ suspension: '懸浮',
chart_background: '組件背景',
solid_color: '純色',
split_gradient: '分離漸變',
diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js
index 6465be6c4c..ee387a98f6 100644
--- a/frontend/src/lang/zh.js
+++ b/frontend/src/lang/zh.js
@@ -914,6 +914,7 @@ export default {
password_input_error: '原始密码输入错误'
},
chart: {
+ suspension: '悬浮',
chart_background: '组件背景',
solid_color: '纯色',
split_gradient: '分离渐变',
diff --git a/frontend/src/views/chart/chart/chart.js b/frontend/src/views/chart/chart/chart.js
index 116da2af59..c2c3bf250a 100644
--- a/frontend/src/views/chart/chart/chart.js
+++ b/frontend/src/views/chart/chart/chart.js
@@ -124,6 +124,9 @@ export const DEFAULT_SIZE = {
showIndex: false,
indexLabel: '序号'
}
+export const DEFAULT_SUSPENSION = {
+ show: true
+}
export const DEFAULT_LABEL = {
show: false,
position: 'top',
diff --git a/frontend/src/views/chart/chart/map/map.js b/frontend/src/views/chart/chart/map/map.js
index 4e6e9d7da7..bf9f18311c 100644
--- a/frontend/src/views/chart/chart/map/map.js
+++ b/frontend/src/views/chart/chart/map/map.js
@@ -125,6 +125,11 @@ export function baseMapOption(chart_option, chart, themeStyle, curAreaCode) {
if (themeStyle) {
chart_option.visualMap.textStyle = { color: themeStyle }
}
+ if (customAttr.suspension && !customAttr.suspension.show) {
+ chart_option.visualMap.show = false
+ } else if ('show' in chart_option.visualMap) {
+ delete chart_option.visualMap.show
+ }
}
for (let i = 0; i < valueArr.length; i++) {
diff --git a/frontend/src/views/chart/chart/util.js b/frontend/src/views/chart/chart/util.js
index 3773ba17b3..7550515c99 100644
--- a/frontend/src/views/chart/chart/util.js
+++ b/frontend/src/views/chart/chart/util.js
@@ -3073,7 +3073,8 @@ export const TYPE_CONFIGS = [
'color-selector',
'label-selector',
'tooltip-selector',
- 'title-selector'
+ 'title-selector',
+ 'suspension-selector'
],
propertyInner: {
@@ -3107,6 +3108,9 @@ export const TYPE_CONFIGS = [
'vPosition',
'isItalic',
'isBolder'
+ ],
+ 'suspension-selector': [
+ 'show'
]
}
}
diff --git a/frontend/src/views/chart/components/ChartComponent.vue b/frontend/src/views/chart/components/ChartComponent.vue
index 84c7849e1c..e4cfcfce24 100644
--- a/frontend/src/views/chart/components/ChartComponent.vue
+++ b/frontend/src/views/chart/components/ChartComponent.vue
@@ -13,7 +13,7 @@
:style="{ borderRadius: borderRadius}"
/>
@@ -143,7 +143,8 @@ export default {
mapCenter: null,
linkageActiveParam: null,
buttonTextColor: null,
- loading: true
+ loading: true,
+ showSuspension: true
}
},
@@ -318,6 +319,9 @@ export default {
}
if (chart.type === 'map') {
const customAttr = JSON.parse(chart.customAttr)
+ if (customAttr.suspension) {
+ this.showSuspension = customAttr.suspension.show
+ }
if (!customAttr.areaCode) {
this.myChart.clear()
return
diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue
index a2928853c4..07ae672ac8 100644
--- a/frontend/src/views/chart/view/ChartEdit.vue
+++ b/frontend/src/views/chart/view/ChartEdit.vue
@@ -951,6 +951,7 @@
@onLegendChange="onLegendChange"
@onMarginChange="onMarginChange"
@onChangeBackgroundForm="onChangeBackgroundForm"
+ @onSuspensionChange="onSuspensionChange"
/>
+
+
+
@@ -317,6 +330,7 @@ import LegendSelectorAntV from '@/views/chart/components/componentStyle/LegendSe
import BackgroundColorSelector from '@/views/chart/components/componentStyle/BackgroundColorSelector'
import SplitSelector from '@/views/chart/components/componentStyle/SplitSelector'
import SplitSelectorAntV from '@/views/chart/components/componentStyle/SplitSelectorAntV'
+import SuspensionSelector from '@/components/suspensionSelector'
import { mapState } from 'vuex'
export default {
@@ -344,7 +358,8 @@ export default {
SizeSelector,
ColorSelector,
MarginSelector,
- PluginCom
+ PluginCom,
+ SuspensionSelector
},
props: {
chart: {
@@ -422,6 +437,10 @@ export default {
val['propertyName'] = propertyName
this.$emit('onColorChange', val)
},
+ onSuspensionChange(val, propertyName) {
+ val['propertyName'] = propertyName
+ this.$emit('onSuspensionChange', val)
+ },
onSizeChange(val, propertyName) {
val['propertyName'] = propertyName
this.$emit('onSizeChange', val)
From 0947155d758503ed65f52e59e0557aa0308a0149 Mon Sep 17 00:00:00 2001
From: junjun
Date: Tue, 8 Nov 2022 15:07:32 +0800
Subject: [PATCH 06/44] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=AF=BC=E5=87=BAExcel?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/views/dataset/data/ViewTable.vue | 36 +++++++++++--------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/frontend/src/views/dataset/data/ViewTable.vue b/frontend/src/views/dataset/data/ViewTable.vue
index 8ee482c617..b78ea0c3d2 100644
--- a/frontend/src/views/dataset/data/ViewTable.vue
+++ b/frontend/src/views/dataset/data/ViewTable.vue
@@ -462,21 +462,27 @@ export default {
this.showExport = false
},
exportDatasetRequest() {
- if (this.table.id) {
- this.table.row = 100000
- this.table.filename = this.exportForm.name
- this.table.expressionTree = this.exportForm.expressionTree
- exportDataset(this.table).then((res) => {
- const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
- const link = document.createElement('a')
- link.style.display = 'none'
- link.href = URL.createObjectURL(blob)
- link.download = this.exportForm.name + '.xlsx' // 下载的文件名
- document.body.appendChild(link)
- link.click()
- document.body.removeChild(link)
- })
- }
+ this.$refs['exportForm'].validate((valid) => {
+ if (valid) {
+ if (this.table.id) {
+ this.table.row = 100000
+ this.table.filename = this.exportForm.name
+ this.table.expressionTree = this.exportForm.expressionTree
+ exportDataset(this.table).then((res) => {
+ const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
+ const link = document.createElement('a')
+ link.style.display = 'none'
+ link.href = URL.createObjectURL(blob)
+ link.download = this.exportForm.name + '.xlsx' // 下载的文件名
+ document.body.appendChild(link)
+ link.click()
+ document.body.removeChild(link)
+ })
+ }
+ } else {
+ return false
+ }
+ })
}
}
}
From 43efd938e1528841b6aa65ac6c504f79ae453a22 Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Tue, 8 Nov 2022 15:42:58 +0800
Subject: [PATCH 07/44] =?UTF-8?q?fix:=20=E6=9C=AA=E4=BD=BF=E7=94=A8?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=A0=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/api/commonAjax.js | 38 -
frontend/src/components/IconSelect/index.vue | 85 -
.../src/components/IconSelect/requireIcons.js | 11 -
.../components/asyncSoltComponent/index.vue | 76 -
frontend/src/components/breadcrumb/index.vue | 92 -
.../components/business/ElSelectAll/index.vue | 128 -
.../business/complexTable/index.vue | 131 -
.../business/conditionTable/index.vue | 98 -
.../components/business/treeTable/index.vue | 115 -
.../canvas/assets/iconfont/demo.css | 539 ---
.../canvas/assets/iconfont/demo_index.html | 307 --
.../canvas/components/AnimationList.vue | 123 -
.../components/canvas/components/AttrList.vue | 153 -
.../canvas/components/AttrListExtend.vue | 204 --
.../canvas/components/ComponentList.vue | 73 -
.../canvas/components/EventList.vue | 99 -
.../components/canvas/components/Modal.vue | 56 -
.../canvas/components/editor/Hyperlinks.vue | 148 -
.../components/editor/PreviewMobile.vue | 295 --
.../components/editor/SettingMenuTest.vue | 204 --
.../canvas/components/editor/index.vue | 1896 -----------
.../customComponent/LinkJumpSetDialog.vue | 69 -
frontend/src/components/canvas/index.vue | 158 -
.../src/components/canvas/styles/reset.css | 52 -
.../canvas/utils/animationClassData.js | 94 -
.../dataease/dragbar/DeBottom2TopDragBar.vue | 30 -
.../dataease/dragbar/DeRight2LeftDragBar.vue | 31 -
frontend/src/components/deViewSelect/dom.js | 32 -
frontend/src/components/doc/index.vue | 19 -
frontend/src/components/gridButton/index.vue | 44 -
frontend/src/components/hamburger/index.vue | 47 -
frontend/src/components/pagination/index.vue | 104 -
frontend/src/components/screenfull/index.vue | 63 -
frontend/src/components/sizeSelect/index.vue | 67 -
frontend/src/components/themePicker/index.vue | 169 -
.../src/directive/DataPermission/index.js | 16 -
frontend/src/lang/es.js | 175 -
frontend/src/lang/ja.js | 175 -
frontend/src/plugins/Blob.js | 210 --
frontend/src/plugins/Export2Excel.js | 137 -
frontend/src/styles/deicon/demo.css | 539 ---
frontend/src/styles/deicon/demo_index.html | 2925 -----------------
frontend/src/styles/vdrr/common.scss | 123 -
frontend/src/styles/vdrr/customize.scss | 147 -
frontend/src/styles/vdrr/highlight.scss | 50 -
frontend/src/styles/vdrr/markdown.scss | 247 --
46 files changed, 10594 deletions(-)
delete mode 100644 frontend/src/api/commonAjax.js
delete mode 100644 frontend/src/components/IconSelect/index.vue
delete mode 100644 frontend/src/components/IconSelect/requireIcons.js
delete mode 100644 frontend/src/components/asyncSoltComponent/index.vue
delete mode 100644 frontend/src/components/breadcrumb/index.vue
delete mode 100644 frontend/src/components/business/ElSelectAll/index.vue
delete mode 100644 frontend/src/components/business/complexTable/index.vue
delete mode 100644 frontend/src/components/business/conditionTable/index.vue
delete mode 100644 frontend/src/components/business/treeTable/index.vue
delete mode 100644 frontend/src/components/canvas/assets/iconfont/demo.css
delete mode 100644 frontend/src/components/canvas/assets/iconfont/demo_index.html
delete mode 100644 frontend/src/components/canvas/components/AnimationList.vue
delete mode 100644 frontend/src/components/canvas/components/AttrList.vue
delete mode 100644 frontend/src/components/canvas/components/AttrListExtend.vue
delete mode 100644 frontend/src/components/canvas/components/ComponentList.vue
delete mode 100644 frontend/src/components/canvas/components/EventList.vue
delete mode 100644 frontend/src/components/canvas/components/Modal.vue
delete mode 100644 frontend/src/components/canvas/components/editor/Hyperlinks.vue
delete mode 100644 frontend/src/components/canvas/components/editor/PreviewMobile.vue
delete mode 100644 frontend/src/components/canvas/components/editor/SettingMenuTest.vue
delete mode 100644 frontend/src/components/canvas/components/editor/index.vue
delete mode 100644 frontend/src/components/canvas/customComponent/LinkJumpSetDialog.vue
delete mode 100644 frontend/src/components/canvas/index.vue
delete mode 100644 frontend/src/components/canvas/styles/reset.css
delete mode 100644 frontend/src/components/canvas/utils/animationClassData.js
delete mode 100644 frontend/src/components/dataease/dragbar/DeBottom2TopDragBar.vue
delete mode 100644 frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue
delete mode 100644 frontend/src/components/deViewSelect/dom.js
delete mode 100644 frontend/src/components/doc/index.vue
delete mode 100644 frontend/src/components/gridButton/index.vue
delete mode 100644 frontend/src/components/hamburger/index.vue
delete mode 100644 frontend/src/components/pagination/index.vue
delete mode 100644 frontend/src/components/screenfull/index.vue
delete mode 100644 frontend/src/components/sizeSelect/index.vue
delete mode 100644 frontend/src/components/themePicker/index.vue
delete mode 100644 frontend/src/directive/DataPermission/index.js
delete mode 100755 frontend/src/lang/es.js
delete mode 100644 frontend/src/lang/ja.js
delete mode 100644 frontend/src/plugins/Blob.js
delete mode 100644 frontend/src/plugins/Export2Excel.js
delete mode 100644 frontend/src/styles/deicon/demo.css
delete mode 100644 frontend/src/styles/deicon/demo_index.html
delete mode 100644 frontend/src/styles/vdrr/common.scss
delete mode 100644 frontend/src/styles/vdrr/customize.scss
delete mode 100644 frontend/src/styles/vdrr/highlight.scss
delete mode 100644 frontend/src/styles/vdrr/markdown.scss
diff --git a/frontend/src/api/commonAjax.js b/frontend/src/api/commonAjax.js
deleted file mode 100644
index ea149fb020..0000000000
--- a/frontend/src/api/commonAjax.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import request from '@/utils/request'
-
-export function post(url, data) {
- return request({
- url: url,
- method: 'post',
- loading: true,
- data
- })
-}
-
-export function get(url) {
- return request({
- url: url,
- method: 'get',
- loading: true
- })
-}
-
-export function fileUpload(url, file, files, param) {
- const formData = new FormData()
- if (file) {
- formData.append('file', file)
- }
- if (files) {
- files.forEach(f => {
- formData.append('files', f)
- })
- }
- formData.append('request', new Blob([JSON.stringify(param)], { type: 'application/json' }))
- return request({
- method: 'POST',
- loading: true,
- url: url,
- data: formData
- })
-}
-export default { fileUpload }
diff --git a/frontend/src/components/IconSelect/index.vue b/frontend/src/components/IconSelect/index.vue
deleted file mode 100644
index 29055d477f..0000000000
--- a/frontend/src/components/IconSelect/index.vue
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/IconSelect/requireIcons.js b/frontend/src/components/IconSelect/requireIcons.js
deleted file mode 100644
index 8c073d39e1..0000000000
--- a/frontend/src/components/IconSelect/requireIcons.js
+++ /dev/null
@@ -1,11 +0,0 @@
-
-const req = require.context('@/icons/svg', false, /\.svg$/)
-const requireAll = requireContext => requireContext.keys()
-
-const re = /\.\/(.*)\.svg/
-
-const icons = requireAll(req).map(i => {
- return i.match(re)[1]
-})
-
-export default icons
diff --git a/frontend/src/components/asyncSoltComponent/index.vue b/frontend/src/components/asyncSoltComponent/index.vue
deleted file mode 100644
index 4db8a5468c..0000000000
--- a/frontend/src/components/asyncSoltComponent/index.vue
+++ /dev/null
@@ -1,76 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/breadcrumb/index.vue b/frontend/src/components/breadcrumb/index.vue
deleted file mode 100644
index c920645c89..0000000000
--- a/frontend/src/components/breadcrumb/index.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
- 当前位置:
- {{ item.meta.title }}
- {{ item.meta.title }}
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/business/ElSelectAll/index.vue b/frontend/src/components/business/ElSelectAll/index.vue
deleted file mode 100644
index 9254ee3b59..0000000000
--- a/frontend/src/components/business/ElSelectAll/index.vue
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/business/complexTable/index.vue b/frontend/src/components/business/complexTable/index.vue
deleted file mode 100644
index 57a50c528d..0000000000
--- a/frontend/src/components/business/complexTable/index.vue
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/business/conditionTable/index.vue b/frontend/src/components/business/conditionTable/index.vue
deleted file mode 100644
index 2d1d535cf7..0000000000
--- a/frontend/src/components/business/conditionTable/index.vue
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/business/treeTable/index.vue b/frontend/src/components/business/treeTable/index.vue
deleted file mode 100644
index 2a07e24da6..0000000000
--- a/frontend/src/components/business/treeTable/index.vue
+++ /dev/null
@@ -1,115 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/assets/iconfont/demo.css b/frontend/src/components/canvas/assets/iconfont/demo.css
deleted file mode 100644
index b7af3aa35d..0000000000
--- a/frontend/src/components/canvas/assets/iconfont/demo.css
+++ /dev/null
@@ -1,539 +0,0 @@
-/* Logo 字体 */
-@font-face {
- font-family: "iconfont logo";
- src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
- src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
-}
-
-.logo {
- font-family: "iconfont logo";
- font-size: 160px;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-/* tabs */
-.nav-tabs {
- position: relative;
-}
-
-.nav-tabs .nav-more {
- position: absolute;
- right: 0;
- bottom: 0;
- height: 42px;
- line-height: 42px;
- color: #666;
-}
-
-#tabs {
- border-bottom: 1px solid #eee;
-}
-
-#tabs li {
- cursor: pointer;
- width: 100px;
- height: 40px;
- line-height: 40px;
- text-align: center;
- font-size: 16px;
- border-bottom: 2px solid transparent;
- position: relative;
- z-index: 1;
- margin-bottom: -1px;
- color: #666;
-}
-
-
-#tabs .active {
- border-bottom-color: #f00;
- color: #222;
-}
-
-.tab-container .content {
- display: none;
-}
-
-/* 页面布局 */
-.main {
- padding: 30px 100px;
- width: 960px;
- margin: 0 auto;
-}
-
-.main .logo {
- color: #333;
- text-align: left;
- margin-bottom: 30px;
- line-height: 1;
- height: 110px;
- margin-top: -50px;
- overflow: hidden;
- *zoom: 1;
-}
-
-.main .logo a {
- font-size: 160px;
- color: #333;
-}
-
-.helps {
- margin-top: 40px;
-}
-
-.helps pre {
- padding: 20px;
- margin: 10px 0;
- border: solid 1px #e7e1cd;
- background-color: #fffdef;
- overflow: auto;
-}
-
-.icon_lists {
- width: 100% !important;
- overflow: hidden;
- *zoom: 1;
-}
-
-.icon_lists li {
- width: 100px;
- margin-bottom: 10px;
- margin-right: 20px;
- text-align: center;
- list-style: none !important;
- cursor: default;
-}
-
-.icon_lists li .code-name {
- line-height: 1.2;
-}
-
-.icon_lists .icon {
- display: block;
- height: 100px;
- line-height: 100px;
- font-size: 42px;
- margin: 10px auto;
- color: #333;
- -webkit-transition: font-size 0.25s linear, width 0.25s linear;
- -moz-transition: font-size 0.25s linear, width 0.25s linear;
- transition: font-size 0.25s linear, width 0.25s linear;
-}
-
-.icon_lists .icon:hover {
- font-size: 100px;
-}
-
-.icon_lists .svg-icon {
- /* 通过设置 font-size 来改变图标大小 */
- width: 1em;
- /* 图标和文字相邻时,垂直对齐 */
- vertical-align: -0.15em;
- /* 通过设置 color 来改变 SVG 的颜色/fill */
- fill: currentColor;
- /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
- normalize.css 中也包含这行 */
- overflow: hidden;
-}
-
-.icon_lists li .name,
-.icon_lists li .code-name {
- color: #666;
-}
-
-/* markdown 样式 */
-.markdown {
- color: #666;
- font-size: 14px;
- line-height: 1.8;
-}
-
-.highlight {
- line-height: 1.5;
-}
-
-.markdown img {
- vertical-align: middle;
- max-width: 100%;
-}
-
-.markdown h1 {
- color: #404040;
- font-weight: 500;
- line-height: 40px;
- margin-bottom: 24px;
-}
-
-.markdown h2,
-.markdown h3,
-.markdown h4,
-.markdown h5,
-.markdown h6 {
- color: #404040;
- margin: 1.6em 0 0.6em 0;
- font-weight: 500;
- clear: both;
-}
-
-.markdown h1 {
- font-size: 28px;
-}
-
-.markdown h2 {
- font-size: 22px;
-}
-
-.markdown h3 {
- font-size: 16px;
-}
-
-.markdown h4 {
- font-size: 14px;
-}
-
-.markdown h5 {
- font-size: 12px;
-}
-
-.markdown h6 {
- font-size: 12px;
-}
-
-.markdown hr {
- height: 1px;
- border: 0;
- background: #e9e9e9;
- margin: 16px 0;
- clear: both;
-}
-
-.markdown p {
- margin: 1em 0;
-}
-
-.markdown > p,
-.markdown > blockquote,
-.markdown > .highlight,
-.markdown > ol,
-.markdown > ul {
- width: 80%;
-}
-
-.markdown ul > li {
- list-style: circle;
-}
-
-.markdown > ul li,
-.markdown blockquote ul > li {
- margin-left: 20px;
- padding-left: 4px;
-}
-
-.markdown > ul li p,
-.markdown > ol li p {
- margin: 0.6em 0;
-}
-
-.markdown ol > li {
- list-style: decimal;
-}
-
-.markdown > ol li,
-.markdown blockquote ol > li {
- margin-left: 20px;
- padding-left: 4px;
-}
-
-.markdown code {
- margin: 0 3px;
- padding: 0 5px;
- background: #eee;
- border-radius: 3px;
-}
-
-.markdown strong,
-.markdown b {
- font-weight: 600;
-}
-
-.markdown > table {
- border-collapse: collapse;
- border-spacing: 0px;
- empty-cells: show;
- border: 1px solid #e9e9e9;
- width: 95%;
- margin-bottom: 24px;
-}
-
-.markdown > table th {
- white-space: nowrap;
- color: #333;
- font-weight: 600;
-}
-
-.markdown > table th,
-.markdown > table td {
- border: 1px solid #e9e9e9;
- padding: 8px 16px;
- text-align: left;
-}
-
-.markdown > table th {
- background: #F7F7F7;
-}
-
-.markdown blockquote {
- font-size: 90%;
- color: #999;
- border-left: 4px solid #e9e9e9;
- padding-left: 0.8em;
- margin: 1em 0;
-}
-
-.markdown blockquote p {
- margin: 0;
-}
-
-.markdown .anchor {
- opacity: 0;
- transition: opacity 0.3s ease;
- margin-left: 8px;
-}
-
-.markdown .waiting {
- color: #ccc;
-}
-
-.markdown h1:hover .anchor,
-.markdown h2:hover .anchor,
-.markdown h3:hover .anchor,
-.markdown h4:hover .anchor,
-.markdown h5:hover .anchor,
-.markdown h6:hover .anchor {
- opacity: 1;
- display: inline-block;
-}
-
-.markdown > br,
-.markdown > p > br {
- clear: both;
-}
-
-
-.hljs {
- display: block;
- background: white;
- padding: 0.5em;
- color: #333333;
- overflow-x: auto;
-}
-
-.hljs-comment,
-.hljs-meta {
- color: #969896;
-}
-
-.hljs-string,
-.hljs-variable,
-.hljs-template-variable,
-.hljs-strong,
-.hljs-emphasis,
-.hljs-quote {
- color: #df5000;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-type {
- color: #a71d5d;
-}
-
-.hljs-literal,
-.hljs-symbol,
-.hljs-bullet,
-.hljs-attribute {
- color: #0086b3;
-}
-
-.hljs-section,
-.hljs-name {
- color: #63a35c;
-}
-
-.hljs-tag {
- color: #333333;
-}
-
-.hljs-title,
-.hljs-attr,
-.hljs-selector-id,
-.hljs-selector-class,
-.hljs-selector-attr,
-.hljs-selector-pseudo {
- color: #795da3;
-}
-
-.hljs-addition {
- color: #55a532;
- background-color: #eaffea;
-}
-
-.hljs-deletion {
- color: #bd2c00;
- background-color: #ffecec;
-}
-
-.hljs-link {
- text-decoration: underline;
-}
-
-/* 代码高亮 */
-/* PrismJS 1.15.0
-https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
-/**
- * prism.js default theme for JavaScript, CSS and HTML
- * Based on dabblet (http://dabblet.com)
- * @author Lea Verou
- */
-code[class*="language-"],
-pre[class*="language-"] {
- color: black;
- background: none;
- text-shadow: 0 1px white;
- font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
-
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
-
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
-}
-
-pre[class*="language-"]::-moz-selection,
-pre[class*="language-"] ::-moz-selection,
-code[class*="language-"]::-moz-selection,
-code[class*="language-"] ::-moz-selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-pre[class*="language-"]::selection,
-pre[class*="language-"] ::selection,
-code[class*="language-"]::selection,
-code[class*="language-"] ::selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-@media print {
-
- code[class*="language-"],
- pre[class*="language-"] {
- text-shadow: none;
- }
-}
-
-/* Code blocks */
-pre[class*="language-"] {
- padding: 1em;
- margin: .5em 0;
- overflow: auto;
-}
-
-:not(pre) > code[class*="language-"],
-pre[class*="language-"] {
- background: #f5f2f0;
-}
-
-/* Inline code */
-:not(pre) > code[class*="language-"] {
- padding: .1em;
- border-radius: .3em;
- white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: slategray;
-}
-
-.token.punctuation {
- color: #999;
-}
-
-.namespace {
- opacity: .7;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: #905;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
- color: #690;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
- color: #9a6e3a;
- background: hsla(0, 0%, 100%, .5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword {
- color: #07a;
-}
-
-.token.function,
-.token.class-name {
- color: #DD4A68;
-}
-
-.token.regex,
-.token.important,
-.token.variable {
- color: #e90;
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
diff --git a/frontend/src/components/canvas/assets/iconfont/demo_index.html b/frontend/src/components/canvas/assets/iconfont/demo_index.html
deleted file mode 100644
index 70918ca7c4..0000000000
--- a/frontend/src/components/canvas/assets/iconfont/demo_index.html
+++ /dev/null
@@ -1,307 +0,0 @@
-
-
-
-
- IconFont Demo
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - Unicode
- - Font class
- - Symbol
-
-
-
查看项目
-
-
-
-
-
-
- -
-
-
向右旋转
- 
-
-
- -
-
-
图片
- 
-
-
- -
-
-
锁
- 
-
-
- -
-
-
矩形
- 
-
-
- -
-
-
文本
- 
-
-
- -
-
-
按钮
- 
-
-
-
-
-
Unicode 引用
-
-
-
Unicode 是字体在网页端最原始的应用方式,特点是:
-
- - 兼容性最好,支持 IE6+,及所有现代浏览器。
- - 支持按字体的方式去动态调整图标大小,颜色等等。
- - 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
-
-
- 注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式
-
-
Unicode 使用步骤如下:
-
第一步:拷贝项目下面生成的 @font-face
-
@font-face {
- font-family: 'iconfont';
- src: url('iconfont.eot');
- src: url('iconfont.eot?#iefix') format('embedded-opentype'),
- url('iconfont.woff2') format('woff2'),
- url('iconfont.woff') format('woff'),
- url('iconfont.ttf') format('truetype');
-}
-
-
第二步:定义使用 iconfont 的样式
-
.iconfont {
- font-family: "iconfont" !important;
- font-size: 16px;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-
第三步:挑选相应图标并获取字体编码,应用于页面
-
-<span class="iconfont">3</span>
-
-
- "iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
-
-
-
-
-
-
-
font-class 引用
-
-
-
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
-
与 Unicode 使用方式相比,具有如下特点:
-
- - 兼容性良好,支持 IE8+,及所有现代浏览器。
- - 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
- - 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
- - 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
-
-
使用步骤如下:
-
第一步:引入项目下面生成的 fontclass 代码:
-
<link rel="stylesheet" href="./iconfont.css">
-
-
第二步:挑选相应图标并获取类名,应用于页面:
-
<span class="iconfont icon-xxx"></span>
-
-
- "
- iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
-
-
-
-
-
-
- -
-
-
向右旋转
- #icon-xiangyouxuanzhuan
-
-
- -
-
-
图片
- #icon-tupian
-
-
- -
-
-
锁
- #icon-suo
-
-
- -
-
-
矩形
- #icon-juxing
-
-
- -
-
-
文本
- #icon-wenben
-
-
- -
-
-
按钮
- #icon-button
-
-
-
-
-
Symbol 引用
-
-
-
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
- 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
-
- - 支持多色图标了,不再受单色限制。
- - 通过一些技巧,支持像字体那样,通过
font-size
, color
来调整样式。
- - 兼容性较差,支持 IE9+,及现代浏览器。
- - 浏览器渲染 SVG 的性能一般,还不如 png。
-
-
使用步骤如下:
-
第一步:引入项目下面生成的 symbol 代码:
-
<script src="./iconfont.js"></script>
-
-
第二步:加入通用 CSS 代码(引入一次就行):
-
<style>
-.icon {
- width: 1em;
- height: 1em;
- vertical-align: -0.15em;
- fill: currentColor;
- overflow: hidden;
-}
-</style>
-
-
第三步:挑选相应图标并获取类名,应用于页面:
-
<svg class="icon" aria-hidden="true">
- <use xlink:href="#icon-xxx"></use>
-</svg>
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/AnimationList.vue b/frontend/src/components/canvas/components/AnimationList.vue
deleted file mode 100644
index a8fe652a1a..0000000000
--- a/frontend/src/components/canvas/components/AnimationList.vue
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
添加动画
-
预览动画
-
-
- {{ tag.label }}
-
-
-
-
-
-
-
-
-
-
-
- {{ animate.label }}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/AttrList.vue b/frontend/src/components/canvas/components/AttrList.vue
deleted file mode 100644
index fd5486f318..0000000000
--- a/frontend/src/components/canvas/components/AttrList.vue
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/AttrListExtend.vue b/frontend/src/components/canvas/components/AttrListExtend.vue
deleted file mode 100644
index deedb76788..0000000000
--- a/frontend/src/components/canvas/components/AttrListExtend.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/ComponentList.vue b/frontend/src/components/canvas/components/ComponentList.vue
deleted file mode 100644
index ec757d1fa2..0000000000
--- a/frontend/src/components/canvas/components/ComponentList.vue
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
- {{ item.label }}
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/EventList.vue b/frontend/src/components/canvas/components/EventList.vue
deleted file mode 100644
index 32d9c200f6..0000000000
--- a/frontend/src/components/canvas/components/EventList.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-
-
-
-
添加事件
-
-
- {{ event }}
-
-
-
-
-
-
-
-
-
-
- 确定
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/Modal.vue b/frontend/src/components/canvas/components/Modal.vue
deleted file mode 100644
index 894a51e9cb..0000000000
--- a/frontend/src/components/canvas/components/Modal.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/editor/Hyperlinks.vue b/frontend/src/components/canvas/components/editor/Hyperlinks.vue
deleted file mode 100644
index 9751e10900..0000000000
--- a/frontend/src/components/canvas/components/editor/Hyperlinks.vue
+++ /dev/null
@@ -1,148 +0,0 @@
-
-
-
-
-
-
-
-
- Tips:{{ $t('panel.link_open_tips') }}
-
-
-
-
- {{ $t('panel.new_window') }}
- {{ $t('panel.now_window') }}
-
-
-
-
-
-
- {{ $t('panel.confirm') }}
- {{ $t('panel.cancel') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/editor/PreviewMobile.vue b/frontend/src/components/canvas/components/editor/PreviewMobile.vue
deleted file mode 100644
index bebde5aabb..0000000000
--- a/frontend/src/components/canvas/components/editor/PreviewMobile.vue
+++ /dev/null
@@ -1,295 +0,0 @@
-
-
-
-
-
-
- {{ $t('panel.panelNull') }}
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/editor/SettingMenuTest.vue b/frontend/src/components/canvas/components/editor/SettingMenuTest.vue
deleted file mode 100644
index 7b488f6e62..0000000000
--- a/frontend/src/components/canvas/components/editor/SettingMenuTest.vue
+++ /dev/null
@@ -1,204 +0,0 @@
-
-
-
-
- TEST
-
- {{ $t('panel.copy') }}
- {{ $t('panel.delete') }}
- {{ $t('panel.topComponent') }}
- {{ $t('panel.bottomComponent') }}
- {{ $t('panel.upComponent') }}
- {{ $t('panel.downComponent') }}
- 联动设置
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/components/editor/index.vue b/frontend/src/components/canvas/components/editor/index.vue
deleted file mode 100644
index 913e10f2e1..0000000000
--- a/frontend/src/components/canvas/components/editor/index.vue
+++ /dev/null
@@ -1,1896 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ $t('chart.export_img') }}
-
-
- {{ $t('chart.export') }}Excel
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/customComponent/LinkJumpSetDialog.vue b/frontend/src/components/canvas/customComponent/LinkJumpSetDialog.vue
deleted file mode 100644
index 06d1892347..0000000000
--- a/frontend/src/components/canvas/customComponent/LinkJumpSetDialog.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
- this is test
-
-
- this is test2
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/index.vue b/frontend/src/components/canvas/index.vue
deleted file mode 100644
index e2e06ddf5e..0000000000
--- a/frontend/src/components/canvas/index.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/canvas/styles/reset.css b/frontend/src/components/canvas/styles/reset.css
deleted file mode 100644
index 3c0d4df5fc..0000000000
--- a/frontend/src/components/canvas/styles/reset.css
+++ /dev/null
@@ -1,52 +0,0 @@
-body,
-button,
-input,
-p,
-li,
-ol,
-ul,
-div,
-section,
-article,
-td,
-th,
-span,
-textarea,
-form,
-footer,
-header,
-nav,
-main,
-address,
-aside,
-pre,
-canvas {
- margin: 0;
- padding: 0;
- box-sizing: border-box;
-}
-
-body {
- overflow: hidden;
-}
-
-li {
- list-style: none;
-}
-
-#app {
- /*overflow: hidden;*/
-}
-
-.el-tabs {
- height: 100%;
-}
-
-.el-tabs__content {
- height: calc(100% - 55px);
- overflow: auto;
-}
-
-.el-tabs__nav-scroll {
- padding-left: 20px;
-}
diff --git a/frontend/src/components/canvas/utils/animationClassData.js b/frontend/src/components/canvas/utils/animationClassData.js
deleted file mode 100644
index 5ab527b6df..0000000000
--- a/frontend/src/components/canvas/utils/animationClassData.js
+++ /dev/null
@@ -1,94 +0,0 @@
-export default [
- {
- label: '进入',
- children: [
- { label: '渐显', value: 'fadeIn' },
- { label: '向右进入', value: 'fadeInLeft' },
- { label: '向左进入', value: 'fadeInRight' },
- { label: '向上进入', value: 'fadeInUp' },
- { label: '向下进入', value: 'fadeInDown' },
- { label: '向右长距进入', value: 'fadeInLeftBig' },
- { label: '向左长距进入', value: 'fadeInRightBig' },
- { label: '向上长距进入', value: 'fadeInUpBig' },
- { label: '向下长距进入', value: 'fadeInDownBig' },
- { label: '旋转进入', value: 'rotateIn' },
- { label: '左顺时针旋转', value: 'rotateInDownLeft' },
- { label: '右逆时针旋转', value: 'rotateInDownRight' },
- { label: '左逆时针旋转', value: 'rotateInUpLeft' },
- { label: '右逆时针旋转', value: 'rotateInUpRight' },
- { label: '弹入', value: 'bounceIn' },
- { label: '向右弹入', value: 'bounceInLeft' },
- { label: '向左弹入', value: 'bounceInRight' },
- { label: '向上弹入', value: 'bounceInUp' },
- { label: '向下弹入', value: 'bounceInDown' },
- { label: '光速从右进入', value: 'lightSpeedInRight' },
- { label: '光速从左进入', value: 'lightSpeedInLeft' },
- { label: '光速从右退出', value: 'lightSpeedOutRight' },
- { label: '光速从左退出', value: 'lightSpeedOutLeft' },
- { label: 'Y轴旋转', value: 'flip' },
- { label: '中心X轴旋转', value: 'flipInX' },
- { label: '中心Y轴旋转', value: 'flipInY' },
- { label: '左长半径旋转', value: 'rollIn' },
- { label: '由小变大进入', value: 'zoomIn' },
- { label: '左变大进入', value: 'zoomInLeft' },
- { label: '右变大进入', value: 'zoomInRight' },
- { label: '向上变大进入', value: 'zoomInUp' },
- { label: '向下变大进入', value: 'zoomInDown' },
- { label: '向右滑动展开', value: 'slideInLeft' },
- { label: '向左滑动展开', value: 'slideInRight' },
- { label: '向上滑动展开', value: 'slideInUp' },
- { label: '向下滑动展开', value: 'slideInDown' }
- ]
- },
- {
- label: '强调',
- children: [
- { label: '弹跳', value: 'bounce' },
- { label: '闪烁', value: 'flash' },
- { label: '放大缩小', value: 'pulse' },
- { label: '放大缩小弹簧', value: 'rubberBand' },
- { label: '左右晃动', value: 'headShake' },
- { label: '左右扇形摇摆', value: 'swing' },
- { label: '放大晃动缩小', value: 'tada' },
- { label: '扇形摇摆', value: 'wobble' },
- { label: '左右上下晃动', value: 'jello' },
- { label: 'Y轴旋转', value: 'flip' }
- ]
- },
- {
- label: '退出',
- children: [
- { label: '渐隐', value: 'fadeOut' },
- { label: '向左退出', value: 'fadeOutLeft' },
- { label: '向右退出', value: 'fadeOutRight' },
- { label: '向上退出', value: 'fadeOutUp' },
- { label: '向下退出', value: 'fadeOutDown' },
- { label: '向左长距退出', value: 'fadeOutLeftBig' },
- { label: '向右长距退出', value: 'fadeOutRightBig' },
- { label: '向上长距退出', value: 'fadeOutUpBig' },
- { label: '向下长距退出', value: 'fadeOutDownBig' },
- { label: '旋转退出', value: 'rotateOut' },
- { label: '左顺时针旋转', value: 'rotateOutDownLeft' },
- { label: '右逆时针旋转', value: 'rotateOutDownRight' },
- { label: '左逆时针旋转', value: 'rotateOutUpLeft' },
- { label: '右逆时针旋转', value: 'rotateOutUpRight' },
- { label: '弹出', value: 'bounceOut' },
- { label: '向左弹出', value: 'bounceOutLeft' },
- { label: '向右弹出', value: 'bounceOutRight' },
- { label: '向上弹出', value: 'bounceOutUp' },
- { label: '向下弹出', value: 'bounceOutDown' },
- { label: '中心X轴旋转', value: 'flipOutX' },
- { label: '中心Y轴旋转', value: 'flipOutY' },
- { label: '左长半径旋转', value: 'rollOut' },
- { label: '由小变大退出', value: 'zoomOut' },
- { label: '左变大退出', value: 'zoomOutLeft' },
- { label: '右变大退出', value: 'zoomOutRight' },
- { label: '向上变大退出', value: 'zoomOutUp' },
- { label: '向下变大退出', value: 'zoomOutDown' },
- { label: '向左滑动收起', value: 'slideOutLeft' },
- { label: '向右滑动收起', value: 'slideOutRight' },
- { label: '向上滑动收起', value: 'slideOutUp' },
- { label: '向下滑动收起', value: 'slideOutDown' }
- ]
- }
-]
diff --git a/frontend/src/components/dataease/dragbar/DeBottom2TopDragBar.vue b/frontend/src/components/dataease/dragbar/DeBottom2TopDragBar.vue
deleted file mode 100644
index 229efd2a32..0000000000
--- a/frontend/src/components/dataease/dragbar/DeBottom2TopDragBar.vue
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue b/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue
deleted file mode 100644
index 73250bd947..0000000000
--- a/frontend/src/components/dataease/dragbar/DeRight2LeftDragBar.vue
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/deViewSelect/dom.js b/frontend/src/components/deViewSelect/dom.js
deleted file mode 100644
index 0077c09474..0000000000
--- a/frontend/src/components/deViewSelect/dom.js
+++ /dev/null
@@ -1,32 +0,0 @@
-
-export const on = (function() {
- if (document.addEventListener) {
- return function(element, event, handler) {
- if (element && event && handler) {
- element.addEventListener(event, handler, false)
- }
- }
- } else {
- return function(element, event, handler) {
- if (element && event && handler) {
- element.attachEvent('on' + event, handler)
- }
- }
- }
-})()
-export const off = (function() {
- if (document.removeEventListener) {
- return function(element, event, handler) {
- if (element && event) {
- element.removeEventListener(event, handler, false)
- }
- }
- } else {
- return function(element, event, handler) {
- if (element && event) {
- element.detachEvent('on' + event, handler)
- }
- }
- }
-})()
-
diff --git a/frontend/src/components/doc/index.vue b/frontend/src/components/doc/index.vue
deleted file mode 100644
index f39e68135f..0000000000
--- a/frontend/src/components/doc/index.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/gridButton/index.vue b/frontend/src/components/gridButton/index.vue
deleted file mode 100644
index 729d9e47a4..0000000000
--- a/frontend/src/components/gridButton/index.vue
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/hamburger/index.vue b/frontend/src/components/hamburger/index.vue
deleted file mode 100644
index 2fe8862c13..0000000000
--- a/frontend/src/components/hamburger/index.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/pagination/index.vue b/frontend/src/components/pagination/index.vue
deleted file mode 100644
index 4e2749b3c2..0000000000
--- a/frontend/src/components/pagination/index.vue
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/components/screenfull/index.vue b/frontend/src/components/screenfull/index.vue
deleted file mode 100644
index fc970653ca..0000000000
--- a/frontend/src/components/screenfull/index.vue
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/components/sizeSelect/index.vue b/frontend/src/components/sizeSelect/index.vue
deleted file mode 100644
index dae9876809..0000000000
--- a/frontend/src/components/sizeSelect/index.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
- {{
- item.label }}
-
-
-
-
-
-
diff --git a/frontend/src/components/themePicker/index.vue b/frontend/src/components/themePicker/index.vue
deleted file mode 100644
index 1bd21b4364..0000000000
--- a/frontend/src/components/themePicker/index.vue
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-
-
-
-
-
diff --git a/frontend/src/directive/DataPermission/index.js b/frontend/src/directive/DataPermission/index.js
deleted file mode 100644
index 681a63f34c..0000000000
--- a/frontend/src/directive/DataPermission/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-function checkDataPermission(el, binding, vnode) {
- // eslint-disable-next-line no-unused-vars
- const dataPermission = vnode.privileges
- // eslint-disable-next-line no-unused-vars
- const { value } = binding
- el.parentNode && el.parentNode.removeChild(el)
-}
-
-export default {
- inserted(el, binding, vnode) {
- checkDataPermission(el, binding, vnode)
- },
- update(el, binding, vnode) {
- checkDataPermission(el, binding, vnode)
- }
-}
diff --git a/frontend/src/lang/es.js b/frontend/src/lang/es.js
deleted file mode 100755
index 477af736cb..0000000000
--- a/frontend/src/lang/es.js
+++ /dev/null
@@ -1,175 +0,0 @@
-export default {
- route: {
- dashboard: 'Panel de control',
- documentation: 'Documentación',
- guide: 'Guía',
- permission: 'Permisos',
- rolePermission: 'Permisos de rol',
- pagePermission: 'Permisos de la página',
- directivePermission: 'Permisos de la directiva',
- icons: 'Iconos',
- components: 'Components',
- tinymce: 'Tinymce',
- markdown: 'Markdown',
- jsonEditor: 'Editor JSON',
- dndList: 'Lista Dnd',
- splitPane: 'Panel dividido',
- avatarUpload: 'Subir avatar',
- dropzone: 'Subir ficheros',
- sticky: 'Sticky',
- countTo: 'CountTo',
- componentMixin: 'Mixin',
- backToTop: 'Ir arriba',
- dragDialog: 'Drag Dialog',
- dragSelect: 'Drag Select',
- dragKanban: 'Drag Kanban',
- charts: 'Gráficos',
- keyboardChart: 'Keyboard Chart',
- lineChart: 'Gráfico de líneas',
- mixChart: 'Mix Chart',
- example: 'Ejemplo',
- nested: 'Rutas anidadass',
- menu1: 'Menu 1',
- 'menu1-1': 'Menu 1-1',
- 'menu1-2': 'Menu 1-2',
- 'menu1-2-1': 'Menu 1-2-1',
- 'menu1-2-2': 'Menu 1-2-2',
- 'menu1-3': 'Menu 1-3',
- menu2: 'Menu 2',
- Table: 'Tabla',
- dynamicTable: 'Tabla dinámica',
- dragTable: 'Arrastrar tabla',
- inlineEditTable: 'Editor',
- complexTable: 'Complex Table',
- tab: 'Pestaña',
- form: 'Formulario',
- createArticle: 'Crear artículo',
- editArticle: 'Editar artículo',
- articleList: 'Listado de artículos',
- errorPages: 'Páginas de error',
- page401: '401',
- page404: '404',
- errorLog: 'Registro de errores',
- excel: 'Excel',
- exportExcel: 'Exportar a Excel',
- selectExcel: 'Export seleccionado',
- mergeHeader: 'Merge Header',
- uploadExcel: 'Subir Excel',
- zip: 'Zip',
- pdf: 'PDF',
- exportZip: 'Exportar a Zip',
- theme: 'Tema',
- clipboardDemo: 'Clipboard',
- i18n: 'I18n',
- externalLink: 'Enlace externo',
- profile: 'Profile'
- },
- navbar: {
- logOut: 'Salir',
- dashboard: 'Panel de control',
- github: 'Github',
- theme: 'Tema',
- size: 'Tamaño global',
- profile: 'Profile'
- },
- login: {
- title: 'Formulario de acceso',
- logIn: 'Acceso',
- username: 'Usuario',
- password: 'Contraseña',
- any: 'nada',
- thirdparty: 'Conectar con',
- thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !'
- },
- documentation: {
- documentation: 'Documentación',
- github: 'Repositorio Github'
- },
- permission: {
- addRole: 'Nuevo rol',
- editPermission: 'Permiso de edición',
- roles: 'Tus permisos',
- switchRoles: 'Cambiar permisos',
- tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.',
- delete: 'Borrar',
- confirm: 'Confirmar',
- cancel: 'Cancelar'
- },
- guide: {
- description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',
- button: 'Ver guía'
- },
- components: {
- documentation: 'Documentación',
- tinymceTips: 'Rich text editor is a core part of management system, but at the same time is a place with lots of problems. In the process of selecting rich texts, I also walked a lot of detours. The common rich text editors in the market are basically used, and the finally chose Tinymce. See documentation for more detailed rich text editor comparisons and introductions.',
- dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.',
- stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',
- backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',
- backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',
- imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'
- },
- table: {
- dynamicTips1: 'Fixed header, sorted by header order',
- dynamicTips2: 'Not fixed header, sorted by click order',
- dragTips1: 'Orden por defecto',
- dragTips2: 'The after dragging order',
- title: 'Título',
- importance: 'Importancia',
- type: 'Tipo',
- remark: 'Remark',
- search: 'Buscar',
- add: 'Añadir',
- export: 'Exportar',
- reviewer: 'reviewer',
- id: 'ID',
- date: 'Fecha',
- author: 'Author',
- readings: 'Lector',
- status: 'Estado',
- actions: 'Acciones',
- edit: 'Editar',
- publish: 'Publicar',
- draft: 'Draft',
- delete: 'Eliminar',
- cancel: 'Cancelar',
- confirm: 'Confirmar'
- },
- example: {
- warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details'
- },
- errorLog: {
- tips: 'Please click the bug icon in the upper right corner',
- description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
- documentation: 'Documento de introducción'
- },
- excel: {
- export: 'Exportar',
- selectedExport: 'Exportar seleccionados',
- placeholder: 'Por favor escribe un nombre de fichero'
- },
- zip: {
- export: 'Exportar',
- placeholder: 'Por favor escribe un nombre de fichero'
- },
- pdf: {
- tips: 'Here we use window.print() to implement the feature of downloading pdf.'
- },
- theme: {
- change: 'Cambiar tema',
- documentation: 'Documentación del tema',
- tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'
- },
- tagsView: {
- refresh: 'Actualizar',
- close: 'Cerrar',
- closeOthers: 'Cerrar otros',
- closeAll: 'Cerrar todos'
- },
- settings: {
- title: 'Page style setting',
- theme: 'Theme Color',
- tagsView: 'Open Tags-View',
- fixedHeader: 'Fixed Header',
- sidebarLogo: 'Sidebar Logo'
- }
-}
diff --git a/frontend/src/lang/ja.js b/frontend/src/lang/ja.js
deleted file mode 100644
index 7dccd1246b..0000000000
--- a/frontend/src/lang/ja.js
+++ /dev/null
@@ -1,175 +0,0 @@
-export default {
- route: {
- dashboard: 'トップ',
- documentation: 'ドキュメント',
- guide: 'ガイド',
- permission: '権限',
- rolePermission: '権限ロール',
- pagePermission: 'ページ権限',
- directivePermission: 'ディレクティブ権限',
- icons: 'アイコン',
- components: 'コンポーネント',
- tinymce: 'TinyMCE',
- markdown: 'Markdown',
- jsonEditor: 'JSON Editor',
- dndList: 'Drag-And-Drop',
- splitPane: 'パネル',
- avatarUpload: 'アバターアップロード',
- dropzone: 'Dropzone',
- sticky: 'Sticky',
- countTo: 'Count To',
- componentMixin: 'コンポーネントMixin',
- backToTop: 'BackToTop',
- dragDialog: 'Drag Dialog',
- dragSelect: 'Drag Select',
- dragKanban: 'Drag 看板',
- charts: 'チャート',
- keyboardChart: 'Keyboardチャート',
- lineChart: 'Lineチャート',
- mixChart: 'Mixチャート',
- example: 'Example',
- nested: 'Nested Routes',
- menu1: 'メニュー1',
- 'menu1-1': 'メニュー 1-1',
- 'menu1-2': 'メニュー 1-2',
- 'menu1-2-1': 'メニュー 1-2-1',
- 'menu1-2-2': 'メニュー 1-2-2',
- 'menu1-3': 'メニュー 1-3',
- menu2: 'メニュー 2',
- Table: 'Table',
- dynamicTable: '可変 Table',
- dragTable: 'Drag Table',
- inlineEditTable: 'Inline Edit Table',
- complexTable: 'Complex Table',
- tab: 'Tab',
- form: 'フォーム',
- createArticle: '投稿作成',
- editArticle: '投稿編集',
- articleList: '投稿リスト',
- errorPages: 'エラーページ',
- page401: '401',
- page404: '404',
- errorLog: 'エラーログ',
- excel: 'Excel',
- exportExcel: '一括エクスポート',
- selectExcel: '複数選択エクスポート',
- mergeHeader: 'ヘッダーマージ',
- uploadExcel: 'アップロード',
- zip: 'Zip',
- pdf: 'PDF',
- exportZip: 'Export Zip',
- theme: 'テーマ変更',
- clipboardDemo: 'Clipboard',
- i18n: '多言語',
- externalLink: '外部リンク',
- profile: 'プロフィール'
- },
- navbar: {
- dashboard: 'トップ',
- github: 'GitHub',
- logOut: 'ログアウト',
- profile: 'プロフィール',
- theme: 'テーマ変更',
- size: '画面サイズ'
- },
- login: {
- title: 'ユーザログイン',
- logIn: 'ログイン',
- username: 'ユーザ名',
- password: 'パスワード',
- any: 'password',
- thirdparty: '外部IDでログイン',
- thirdpartyTips: 'ローカル環境ではログインできません。実装が必要です。'
- },
- documentation: {
- documentation: 'ドキュメント',
- github: 'Github Link'
- },
- permission: {
- addRole: 'ロール追加',
- editPermission: 'ロール変更',
- roles: 'ロール',
- switchRoles: 'ロール切替',
- tips: 'v-permissionは使えない時があります。例えば: Element-UI の el-tab、 el-table-column 及び他の dom。v-ifを使う必要があります。',
- delete: '削除',
- confirm: '確認',
- cancel: 'キャンセル'
- },
- guide: {
- description: 'ガイドは各機能の説明です。',
- button: 'ガイドを見る'
- },
- components: {
- documentation: 'ドキュメント',
- tinymceTips: 'tinymceは管理画面に重要な機能ですが、その同時に落とし穴がありあす。tinymceを使う道のりが大変でした。Tinymceを使う時に各自のプロジェクト状況で判断が必要です。ドキュメントはこちら',
- dropzoneTips: 'Third partyのパッケージを使わず、独自の実装しています。詳細は @/components/Dropzone',
- stickyTips: 'ページの指定位置へスクロールした場合、表示されます。',
- backToTopTips1: 'トップへスクロールが表示されます。',
- backToTopTips2: 'ボタンのスタイルはカスタマイズできます。例えば、show/hide、height、position。 またはElementのel-tooltipを使って、ツールチップを実装できます。',
- imageUploadTips: 'mockjsは使えないため、カスタマイズしています。公式の最新バージョンを使ってください。'
- },
- table: {
- dynamicTips1: '先頭は固定、最後に追加',
- dynamicTips2: '戦後に追加せず、指定列に追加',
- dragTips1: 'デフォルト順番',
- dragTips2: 'Drag後の順番',
- title: 'タイトル',
- importance: '重要',
- type: 'タイプ',
- remark: '評価',
- search: '検索',
- add: '追加',
- export: 'エクスポート',
- reviewer: 'レビュアー',
- id: '番号',
- date: '日時',
- author: '作成者',
- readings: '閲覧数',
- status: 'ステータス',
- actions: '操作',
- edit: '編集',
- publish: '公開',
- draft: '下書き',
- delete: 'キャンセル',
- cancel: 'キャンセル',
- confirm: '確認'
- },
- example: {
- warning: '新規作成と編集画面は keep-alive を使えないです。keep-alive の include はrouteのキャッシュは使えないです。そのため、component name を使ってキャッシュさせるようにします。このようなキャッシュ機能を作りたい場合,localStorageを使う手があります。もしくは keep-alive の includeを使って、全ページキャッシュする方法はあります。'
- },
- errorLog: {
- tips: '右上のbugアイコンをクリックしてください。',
- description: '管理画面はspaを使う場合が多い、ユーザ体現向上はできますが、想定外エラーが発生する場合があります。Vueはそのエラーハンドリング機能を提供し、エラーレポートができます。',
- documentation: 'ドキュメント'
- },
- excel: {
- export: 'エクスポート',
- selectedExport: 'エクスポート対象を選択してください。',
- placeholder: 'ファイル名を入力してください。'
- },
- zip: {
- export: 'エクスポート',
- placeholder: 'ファイル名を入力してください。'
- },
- pdf: {
- tips: 'window.print() を使ってPDFダウンロードしています。'
- },
- theme: {
- change: 'テーマ切替',
- documentation: 'ドキュメント',
- tips: 'Tips: テーマの切り替え方法はnavbarのtheme-pickと異なります、使い方はドキュメントを確認してください。'
- },
- tagsView: {
- refresh: '更新',
- close: '閉じる',
- closeOthers: 'その他閉じる',
- closeAll: 'すべて閉じる'
- },
- settings: {
- title: 'システムテーマ',
- theme: 'テーマ色',
- tagsView: 'Tags-View 開く',
- fixedHeader: 'Fixed Header',
- sidebarLogo: 'Sidebar Logo'
- }
-}
diff --git a/frontend/src/plugins/Blob.js b/frontend/src/plugins/Blob.js
deleted file mode 100644
index 5ffc1337fd..0000000000
--- a/frontend/src/plugins/Blob.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/* eslint-disable */
-/* Blob.js*/
-
-/*global self, unescape */
-/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,
- plusplus: true */
-
-/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */
-
-(function (view) {
- "use strict";
-
- view.URL = view.URL || view.webkitURL;
-
- if (view.Blob && view.URL) {
- try {
- new Blob;
- return;
- } catch (e) {
- }
- }
-
- // Internally we use a BlobBuilder implementation to base Blob off of
- // in order to support older browsers that only have BlobBuilder
- var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || (function (view) {
- var
- get_class = function (object) {
- return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
- }
- , FakeBlobBuilder = function BlobBuilder() {
- this.data = [];
- }
- , FakeBlob = function Blob(data, type, encoding) {
- this.data = data;
- this.size = data.length;
- this.type = type;
- this.encoding = encoding;
- }
- , FBB_proto = FakeBlobBuilder.prototype
- , FB_proto = FakeBlob.prototype
- , FileReaderSync = view.FileReaderSync
- , FileException = function (type) {
- this.code = this[this.name = type];
- }
- , file_ex_codes = (
- "NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR "
- + "NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR"
- ).split(" ")
- , file_ex_code = file_ex_codes.length
- , real_URL = view.URL || view.webkitURL || view
- , real_create_object_URL = real_URL.createObjectURL
- , real_revoke_object_URL = real_URL.revokeObjectURL
- , URL = real_URL
- , btoa = view.btoa
- , atob = view.atob
-
- , ArrayBuffer = view.ArrayBuffer
- , Uint8Array = view.Uint8Array
-
- , origin = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/
- ;
- FakeBlob.fake = FB_proto.fake = true;
- while (file_ex_code--) {
- FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;
- }
- // Polyfill URL
- if (!real_URL.createObjectURL) {
- URL = view.URL = function (uri) {
- var
- uri_info = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
- , uri_origin
- ;
- uri_info.href = uri;
- if (!("origin" in uri_info)) {
- if (uri_info.protocol.toLowerCase() === "data:") {
- uri_info.origin = null;
- } else {
- uri_origin = uri.match(origin);
- uri_info.origin = uri_origin && uri_origin[1];
- }
- }
- return uri_info;
- };
- }
- URL.createObjectURL = function (blob) {
- var
- type = blob.type
- , data_URI_header
- ;
- if (type === null) {
- type = "application/octet-stream";
- }
- if (blob instanceof FakeBlob) {
- data_URI_header = "data:" + type;
- if (blob.encoding === "base64") {
- return data_URI_header + ";base64," + blob.data;
- } else if (blob.encoding === "URI") {
- return data_URI_header + "," + decodeURIComponent(blob.data);
- }
- if (btoa) {
- return data_URI_header + ";base64," + btoa(blob.data);
- } else {
- return data_URI_header + "," + encodeURIComponent(blob.data);
- }
- } else if (real_create_object_URL) {
- return real_create_object_URL.call(real_URL, blob);
- }
- };
- URL.revokeObjectURL = function (object_URL) {
- if (object_URL.substring(0, 5) !== "data:" && real_revoke_object_URL) {
- real_revoke_object_URL.call(real_URL, object_URL);
- }
- };
- FBB_proto.append = function (data/*, endings*/) {
- var bb = this.data;
- // decode data to a binary string
- if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {
- var
- str = ""
- , buf = new Uint8Array(data)
- , i = 0
- , buf_len = buf.length
- ;
- for (; i < buf_len; i++) {
- str += String.fromCharCode(buf[i]);
- }
- bb.push(str);
- } else if (get_class(data) === "Blob" || get_class(data) === "File") {
- if (FileReaderSync) {
- var fr = new FileReaderSync;
- bb.push(fr.readAsBinaryString(data));
- } else {
- // async FileReader won't work as BlobBuilder is sync
- throw new FileException("NOT_READABLE_ERR");
- }
- } else if (data instanceof FakeBlob) {
- if (data.encoding === "base64" && atob) {
- bb.push(atob(data.data));
- } else if (data.encoding === "URI") {
- bb.push(decodeURIComponent(data.data));
- } else if (data.encoding === "raw") {
- bb.push(data.data);
- }
- } else {
- if (typeof data !== "string") {
- data += ""; // convert unsupported types to strings
- }
- // decode UTF-16 to binary string
- bb.push(unescape(encodeURIComponent(data)));
- }
- };
- FBB_proto.getBlob = function (type) {
- if (!arguments.length) {
- type = null;
- }
- return new FakeBlob(this.data.join(""), type, "raw");
- };
- FBB_proto.toString = function () {
- return "[object BlobBuilder]";
- };
- FB_proto.slice = function (start, end, type) {
- var args = arguments.length;
- if (args < 3) {
- type = null;
- }
- return new FakeBlob(
- this.data.slice(start, args > 1 ? end : this.data.length)
- , type
- , this.encoding
- );
- };
- FB_proto.toString = function () {
- return "[object Blob]";
- };
- FB_proto.close = function () {
- this.size = 0;
- delete this.data;
- };
- return FakeBlobBuilder;
- }(view));
-
- view.Blob = function (blobParts, options) {
- var type = options ? (options.type || "") : "";
- var builder = new BlobBuilder();
- if (blobParts) {
- for (var i = 0, len = blobParts.length; i < len; i++) {
- if (Uint8Array && blobParts[i] instanceof Uint8Array) {
- builder.append(blobParts[i].buffer);
- }
- else {
- builder.append(blobParts[i]);
- }
- }
- }
- var blob = builder.getBlob(type);
- if (!blob.slice && blob.webkitSlice) {
- blob.slice = blob.webkitSlice;
- }
- return blob;
- };
-
- var getPrototypeOf = Object.getPrototypeOf || function (object) {
- return object.__proto__;
- };
- view.Blob.prototype = getPrototypeOf(new view.Blob());
- }(
- typeof self !== "undefined" && self
- || typeof window !== "undefined" && window
- || this
- ));
\ No newline at end of file
diff --git a/frontend/src/plugins/Export2Excel.js b/frontend/src/plugins/Export2Excel.js
deleted file mode 100644
index f0e998b019..0000000000
--- a/frontend/src/plugins/Export2Excel.js
+++ /dev/null
@@ -1,137 +0,0 @@
-require('script-loader!file-saver')
-/* 这里的路径换成自己的 */
-require('@/plugins/Blob.js')
-require('script-loader!xlsx/dist/xlsx.core.min')
-
-function generateArray(table) {
- var out = []
- var rows = table.querySelectorAll('tr')
- var ranges = []
- for (var R = 0; R < rows.length; ++R) {
- var outRow = []
- var row = rows[R]
- var columns = row.querySelectorAll('td')
- for (var C = 0; C < columns.length; ++C) {
- var cell = columns[C]
- var colspan = cell.getAttribute('colspan')
- var rowspan = cell.getAttribute('rowspan')
- var cellValue = cell.innerText
- if (cellValue !== '' && cellValue === +cellValue) cellValue = +cellValue
-
- // Skip ranges
- ranges.forEach(function(range) {
- if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
- for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null)
- }
- })
-
- // Handle Row Span
- if (rowspan || colspan) {
- rowspan = rowspan || 1
- colspan = colspan || 1
- ranges.push({ s: { r: R, c: outRow.length }, e: { r: R + rowspan - 1, c: outRow.length + colspan - 1 }})
- }
-
- // Handle Value
- outRow.push(cellValue !== '' ? cellValue : null)
-
- // Handle Colspan
- if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null)
- }
- out.push(outRow)
- }
- return [out, ranges]
-}
-
-function datenum(v, date1904) {
- if (date1904) v += 1462
- var epoch = Date.parse(v)
- return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000)
-}
-
-function sheet_from_array_of_arrays(data, opts) {
- var ws = {}
- var range = { s: { c: 10000000, r: 10000000 }, e: { c: 0, r: 0 }}
- for (var R = 0; R !== data.length; ++R) {
- for (var C = 0; C !== data[R].length; ++C) {
- if (range.s.r > R) range.s.r = R
- if (range.s.c > C) range.s.c = C
- if (range.e.r < R) range.e.r = R
- if (range.e.c < C) range.e.c = C
- var cell = { v: data[R][C] }
- if (cell.v === null) continue
- // eslint-disable-next-line
- var cell_ref = XLSX.utils.encode_cell({ c: C, r: R })
-
- if (typeof cell.v === 'number') cell.t = 'n'
- else if (typeof cell.v === 'boolean') cell.t = 'b'
- else if (cell.v instanceof Date) {
- cell.t = 'n'
- // eslint-disable-next-line
- cell.z = XLSX.SSF._table[14]
- cell.v = datenum(cell.v)
- } else cell.t = 's'
-
- ws[cell_ref] = cell
- }
- }
- // eslint-disable-next-line
- if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range)
- return ws
-}
-
-function Workbook() {
- if (!(this instanceof Workbook)) return new Workbook()
- this.SheetNames = []
- this.Sheets = {}
-}
-
-function s2ab(s) {
- var buf = new ArrayBuffer(s.length)
- var view = new Uint8Array(buf)
- for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF
- return buf
-}
-
-export function export_table_to_excel(id) {
- var theTable = document.getElementById(id)
- var oo = generateArray(theTable)
- var ranges = oo[1]
-
- /* original data */
- var data = oo[0]
- var ws_name = 'SheetJS'
-
- var wb = new Workbook(); var ws = sheet_from_array_of_arrays(data)
-
- /* add ranges to worksheet */
- // ws['!cols'] = ['apple', 'banan'];
- ws['!merges'] = ranges
-
- /* add worksheet to workbook */
- wb.SheetNames.push(ws_name)
- wb.Sheets[ws_name] = ws
- // eslint-disable-next-line
- var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' })
- // eslint-disable-next-line
- saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), 'test.xlsx')
-}
-
-export function export_json_to_excel(th, jsonData, defaultTitle) {
- /* original data */
-
- var data = jsonData
- data.unshift(th)
- var ws_name = 'SheetJS'
-
- var wb = new Workbook(); var ws = sheet_from_array_of_arrays(data)
-
- /* add worksheet to workbook */
- wb.SheetNames.push(ws_name)
- wb.Sheets[ws_name] = ws
- // eslint-disable-next-line
- var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' })
- var title = defaultTitle || '列表'
- // eslint-disable-next-line
- saveAs(new Blob([s2ab(wbout)], { type: 'application/octet-stream' }), title + '.xlsx')
-}
diff --git a/frontend/src/styles/deicon/demo.css b/frontend/src/styles/deicon/demo.css
deleted file mode 100644
index a67054a0a0..0000000000
--- a/frontend/src/styles/deicon/demo.css
+++ /dev/null
@@ -1,539 +0,0 @@
-/* Logo 字体 */
-@font-face {
- font-family: "iconfont logo";
- src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
- src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
- url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
-}
-
-.logo {
- font-family: "iconfont logo";
- font-size: 160px;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-/* tabs */
-.nav-tabs {
- position: relative;
-}
-
-.nav-tabs .nav-more {
- position: absolute;
- right: 0;
- bottom: 0;
- height: 42px;
- line-height: 42px;
- color: #666;
-}
-
-#tabs {
- border-bottom: 1px solid #eee;
-}
-
-#tabs li {
- cursor: pointer;
- width: 100px;
- height: 40px;
- line-height: 40px;
- text-align: center;
- font-size: 16px;
- border-bottom: 2px solid transparent;
- position: relative;
- z-index: 1;
- margin-bottom: -1px;
- color: #666;
-}
-
-
-#tabs .active {
- border-bottom-color: #f00;
- color: #222;
-}
-
-.tab-container .content {
- display: none;
-}
-
-/* 页面布局 */
-.main {
- padding: 30px 100px;
- width: 960px;
- margin: 0 auto;
-}
-
-.main .logo {
- color: #333;
- text-align: left;
- margin-bottom: 30px;
- line-height: 1;
- height: 110px;
- margin-top: -50px;
- overflow: hidden;
- *zoom: 1;
-}
-
-.main .logo a {
- font-size: 160px;
- color: #333;
-}
-
-.helps {
- margin-top: 40px;
-}
-
-.helps pre {
- padding: 20px;
- margin: 10px 0;
- border: solid 1px #e7e1cd;
- background-color: #fffdef;
- overflow: auto;
-}
-
-.icon_lists {
- width: 100% !important;
- overflow: hidden;
- *zoom: 1;
-}
-
-.icon_lists li {
- width: 100px;
- margin-bottom: 10px;
- margin-right: 20px;
- text-align: center;
- list-style: none !important;
- cursor: default;
-}
-
-.icon_lists li .code-name {
- line-height: 1.2;
-}
-
-.icon_lists .icon {
- display: block;
- height: 100px;
- line-height: 100px;
- font-size: 42px;
- margin: 10px auto;
- color: #333;
- -webkit-transition: font-size 0.25s linear, width 0.25s linear;
- -moz-transition: font-size 0.25s linear, width 0.25s linear;
- transition: font-size 0.25s linear, width 0.25s linear;
-}
-
-.icon_lists .icon:hover {
- font-size: 100px;
-}
-
-.icon_lists .svg-icon {
- /* 通过设置 font-size 来改变图标大小 */
- width: 1em;
- /* 图标和文字相邻时,垂直对齐 */
- vertical-align: -0.15em;
- /* 通过设置 color 来改变 SVG 的颜色/fill */
- fill: currentColor;
- /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
- normalize.css 中也包含这行 */
- overflow: hidden;
-}
-
-.icon_lists li .name,
-.icon_lists li .code-name {
- color: #666;
-}
-
-/* markdown 样式 */
-.markdown {
- color: #666;
- font-size: 14px;
- line-height: 1.8;
-}
-
-.highlight {
- line-height: 1.5;
-}
-
-.markdown img {
- vertical-align: middle;
- max-width: 100%;
-}
-
-.markdown h1 {
- color: #404040;
- font-weight: 500;
- line-height: 40px;
- margin-bottom: 24px;
-}
-
-.markdown h2,
-.markdown h3,
-.markdown h4,
-.markdown h5,
-.markdown h6 {
- color: #404040;
- margin: 1.6em 0 0.6em 0;
- font-weight: 500;
- clear: both;
-}
-
-.markdown h1 {
- font-size: 28px;
-}
-
-.markdown h2 {
- font-size: 22px;
-}
-
-.markdown h3 {
- font-size: 16px;
-}
-
-.markdown h4 {
- font-size: 14px;
-}
-
-.markdown h5 {
- font-size: 12px;
-}
-
-.markdown h6 {
- font-size: 12px;
-}
-
-.markdown hr {
- height: 1px;
- border: 0;
- background: #e9e9e9;
- margin: 16px 0;
- clear: both;
-}
-
-.markdown p {
- margin: 1em 0;
-}
-
-.markdown>p,
-.markdown>blockquote,
-.markdown>.highlight,
-.markdown>ol,
-.markdown>ul {
- width: 80%;
-}
-
-.markdown ul>li {
- list-style: circle;
-}
-
-.markdown>ul li,
-.markdown blockquote ul>li {
- margin-left: 20px;
- padding-left: 4px;
-}
-
-.markdown>ul li p,
-.markdown>ol li p {
- margin: 0.6em 0;
-}
-
-.markdown ol>li {
- list-style: decimal;
-}
-
-.markdown>ol li,
-.markdown blockquote ol>li {
- margin-left: 20px;
- padding-left: 4px;
-}
-
-.markdown code {
- margin: 0 3px;
- padding: 0 5px;
- background: #eee;
- border-radius: 3px;
-}
-
-.markdown strong,
-.markdown b {
- font-weight: 600;
-}
-
-.markdown>table {
- border-collapse: collapse;
- border-spacing: 0px;
- empty-cells: show;
- border: 1px solid #e9e9e9;
- width: 95%;
- margin-bottom: 24px;
-}
-
-.markdown>table th {
- white-space: nowrap;
- color: #333;
- font-weight: 600;
-}
-
-.markdown>table th,
-.markdown>table td {
- border: 1px solid #e9e9e9;
- padding: 8px 16px;
- text-align: left;
-}
-
-.markdown>table th {
- background: #F7F7F7;
-}
-
-.markdown blockquote {
- font-size: 90%;
- color: #999;
- border-left: 4px solid #e9e9e9;
- padding-left: 0.8em;
- margin: 1em 0;
-}
-
-.markdown blockquote p {
- margin: 0;
-}
-
-.markdown .anchor {
- opacity: 0;
- transition: opacity 0.3s ease;
- margin-left: 8px;
-}
-
-.markdown .waiting {
- color: #ccc;
-}
-
-.markdown h1:hover .anchor,
-.markdown h2:hover .anchor,
-.markdown h3:hover .anchor,
-.markdown h4:hover .anchor,
-.markdown h5:hover .anchor,
-.markdown h6:hover .anchor {
- opacity: 1;
- display: inline-block;
-}
-
-.markdown>br,
-.markdown>p>br {
- clear: both;
-}
-
-
-.hljs {
- display: block;
- background: white;
- padding: 0.5em;
- color: #333333;
- overflow-x: auto;
-}
-
-.hljs-comment,
-.hljs-meta {
- color: #969896;
-}
-
-.hljs-string,
-.hljs-variable,
-.hljs-template-variable,
-.hljs-strong,
-.hljs-emphasis,
-.hljs-quote {
- color: #df5000;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-type {
- color: #a71d5d;
-}
-
-.hljs-literal,
-.hljs-symbol,
-.hljs-bullet,
-.hljs-attribute {
- color: #0086b3;
-}
-
-.hljs-section,
-.hljs-name {
- color: #63a35c;
-}
-
-.hljs-tag {
- color: #333333;
-}
-
-.hljs-title,
-.hljs-attr,
-.hljs-selector-id,
-.hljs-selector-class,
-.hljs-selector-attr,
-.hljs-selector-pseudo {
- color: #795da3;
-}
-
-.hljs-addition {
- color: #55a532;
- background-color: #eaffea;
-}
-
-.hljs-deletion {
- color: #bd2c00;
- background-color: #ffecec;
-}
-
-.hljs-link {
- text-decoration: underline;
-}
-
-/* 代码高亮 */
-/* PrismJS 1.15.0
-https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
-/**
- * prism.js default theme for JavaScript, CSS and HTML
- * Based on dabblet (http://dabblet.com)
- * @author Lea Verou
- */
-code[class*="language-"],
-pre[class*="language-"] {
- color: black;
- background: none;
- text-shadow: 0 1px white;
- font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
- text-align: left;
- white-space: pre;
- word-spacing: normal;
- word-break: normal;
- word-wrap: normal;
- line-height: 1.5;
-
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
-
- -webkit-hyphens: none;
- -moz-hyphens: none;
- -ms-hyphens: none;
- hyphens: none;
-}
-
-pre[class*="language-"]::-moz-selection,
-pre[class*="language-"] ::-moz-selection,
-code[class*="language-"]::-moz-selection,
-code[class*="language-"] ::-moz-selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-pre[class*="language-"]::selection,
-pre[class*="language-"] ::selection,
-code[class*="language-"]::selection,
-code[class*="language-"] ::selection {
- text-shadow: none;
- background: #b3d4fc;
-}
-
-@media print {
-
- code[class*="language-"],
- pre[class*="language-"] {
- text-shadow: none;
- }
-}
-
-/* Code blocks */
-pre[class*="language-"] {
- padding: 1em;
- margin: .5em 0;
- overflow: auto;
-}
-
-:not(pre)>code[class*="language-"],
-pre[class*="language-"] {
- background: #f5f2f0;
-}
-
-/* Inline code */
-:not(pre)>code[class*="language-"] {
- padding: .1em;
- border-radius: .3em;
- white-space: normal;
-}
-
-.token.comment,
-.token.prolog,
-.token.doctype,
-.token.cdata {
- color: slategray;
-}
-
-.token.punctuation {
- color: #999;
-}
-
-.namespace {
- opacity: .7;
-}
-
-.token.property,
-.token.tag,
-.token.boolean,
-.token.number,
-.token.constant,
-.token.symbol,
-.token.deleted {
- color: #905;
-}
-
-.token.selector,
-.token.attr-name,
-.token.string,
-.token.char,
-.token.builtin,
-.token.inserted {
- color: #690;
-}
-
-.token.operator,
-.token.entity,
-.token.url,
-.language-css .token.string,
-.style .token.string {
- color: #9a6e3a;
- background: hsla(0, 0%, 100%, .5);
-}
-
-.token.atrule,
-.token.attr-value,
-.token.keyword {
- color: #07a;
-}
-
-.token.function,
-.token.class-name {
- color: #DD4A68;
-}
-
-.token.regex,
-.token.important,
-.token.variable {
- color: #e90;
-}
-
-.token.important,
-.token.bold {
- font-weight: bold;
-}
-
-.token.italic {
- font-style: italic;
-}
-
-.token.entity {
- cursor: help;
-}
diff --git a/frontend/src/styles/deicon/demo_index.html b/frontend/src/styles/deicon/demo_index.html
deleted file mode 100644
index 767b048576..0000000000
--- a/frontend/src/styles/deicon/demo_index.html
+++ /dev/null
@@ -1,2925 +0,0 @@
-
-
-
-
- iconfont Demo
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - Unicode
- - Font class
- - Symbol
-
-
-
查看项目
-
-
-
-
-
-
-
Unicode 引用
-
-
-
Unicode 是字体在网页端最原始的应用方式,特点是:
-
- - 支持按字体的方式去动态调整图标大小,颜色等等。
- - 默认情况下不支持多色,直接添加多色图标会自动去色。
-
-
- 注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)
-
-
Unicode 使用步骤如下:
-
第一步:拷贝项目下面生成的 @font-face
-
@font-face {
- font-family: 'iconfont';
- src: url('iconfont.woff2?t=1662616551987') format('woff2'),
- url('iconfont.woff?t=1662616551987') format('woff'),
- url('iconfont.ttf?t=1662616551987') format('truetype');
-}
-
-
第二步:定义使用 iconfont 的样式
-
.iconfont {
- font-family: "iconfont" !important;
- font-size: 16px;
- font-style: normal;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-
第三步:挑选相应图标并获取字体编码,应用于页面
-
-<span class="iconfont">3</span>
-
-
- "iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
-
-
-
-
-
-
- -
-
-
- application
-
- .icon-application
-
-
-
- -
-
-
- data-source-24
-
- .icon-datasource-select
-
-
-
- -
-
-
- 重置
-
- .icon-zhongzhi2
-
-
-
- -
-
-
- None_Select
-
- .icon-None_Select
-
-
-
- -
-
-
- button_right
-
- .icon-button_right
-
-
-
- -
-
-
- icon-maybe
-
- .icon-icon-maybe
-
-
-
- -
-
-
- icon_up-left_outlined
-
- .icon-icon_up-left_outlined
-
-
-
- -
-
-
- close
-
- .icon-close
-
-
-
- -
-
-
- Frame 3425
-
- .icon-a-Frame3425
-
-
-
- -
-
-
- icon-filter
-
- .icon-icon-filter
-
-
-
- -
-
-
- icon_Batch_outlined
-
- .icon-icon_Batch_outlined
-
-
-
- -
-
-
- icon_clear_outlined
-
- .icon-icon_clear_outlined
-
-
-
- -
-
-
- icon_dialpad_outlined
-
- .icon-icon_dialpad_outlined
-
-
-
- -
-
-
- icon_effects_outlined
-
- .icon-icon_effects_outlined
-
-
-
- -
-
-
- icon_magnify_outlined
-
- .icon-icon_magnify_outlined
-
-
-
- -
-
-
- icon_moments-categories_outlined
-
- .icon-icon_moments-categories_outlined
-
-
-
- -
-
-
- icon_pc_outlined
-
- .icon-icon_pc_outlined
-
-
-
- -
-
-
- icon_phone_outlined
-
- .icon-icon_phone_outlined
-
-
-
- -
-
-
- icon_redo_outlined
-
- .icon-icon_redo_outlined
-
-
-
- -
-
-
- icon_undo_outlined
-
- .icon-icon_undo_outlined
-
-
-
- -
-
-
- icon-more
-
- .icon-icon-more
-
-
-
- -
-
-
- icon-quicksetting
-
- .icon-icon-quicksetting
-
-
-
- -
-
-
- square-selected
-
- .icon-square-selected
-
-
-
- -
-
-
- italic
-
- .icon-italic
-
-
-
- -
-
-
- 箭头
-
- .icon-jiantou
-
-
-
- -
-
-
- magic-line
-
- .icon-magic-line
-
-
-
- -
-
-
- 更多
-
- .icon-gengduo
-
-
-
- -
-
-
- 清空
-
- .icon-qingkong
-
-
-
- -
-
-
- 查看
-
- .icon-chakan
-
-
-
- -
-
-
- outline-redo
-
- .icon-outline-redo
-
-
-
- -
-
-
- outline-undo
-
- .icon-outline-undo
-
-
-
- -
-
-
- 定位
-
- .icon-dingwei
-
-
-
- -
-
-
- 富文本框
-
- .icon-fuwenbenkuang
-
-
-
- -
-
-
- 下架
-
- .icon-unpublish
-
-
-
- -
-
-
- 上架
-
- .icon-publish
-
-
-
- -
-
-
- 发布
-
- .icon-fabu
-
-
-
- -
-
-
- 批量操作
-
- .icon-piliang-copy
-
-
-
- -
-
-
- 图片
-
- .icon-tupian
-
-
-
- -
-
-
- 超链接
-
- .icon-chaolianjie1
-
-
-
- -
-
-
- 跳转
-
- .icon-com-jump
-
-
-
- -
-
-
- 跳转
-
- .icon-component-tiaozhuan
-
-
-
- -
-
-
- 网格\表格
-
- .icon-wangge-open
-
-
-
- -
-
-
- 关闭网格
-
- .icon-wangge-close
-
-
-
- -
-
-
- 流媒体,媒体列表
-
- .icon-a-liumeitimeitiliebiao
-
-
-
- -
-
-
- iframe
-
- .icon-iframe
-
-
-
- -
-
-
- 参数
-
- .icon-canshu
-
-
-
- -
-
-
- 更换
-
- .icon-genghuan
-
-
-
- -
-
-
- 发送邮件
-
- .icon-fasongyoujian
-
-
-
- -
-
-
- github
-
- .icon-github
-
-
-
- -
-
-
- 电话
-
- .icon-dianhua
-
-
-
- -
-
-
- 关闭
-
- .icon-guanbi
-
-
-
- -
-
-
- 矩形
-
- .icon-juxing1
-
-
-
- -
-
-
- 移动端
-
- .icon-yidongduan
-
-
-
- -
-
-
- video
-
- .icon-video
-
-
-
- -
-
-
- 悬浮按钮发动态
-
- .icon-xuanfuanniufadongtai
-
-
-
- -
-
-
- 吸附选择
-
- .icon-xifuxuanze
-
-
-
- -
-
-
- margin
-
- .icon-margin
-
-
-
- -
-
-
- padding
-
- .icon-padding
-
-
-
- -
-
-
- 时间
-
- .icon-shijian
-
-
-
- -
-
-
- 时间格式转换
-
- .icon-shijiangeshizhuanhuan
-
-
-
- -
-
-
- 超链接
-
- .icon-chaolianjie
-
-
-
- -
-
-
- 科学技术
-
- .icon-kexuejishu
-
-
-
- -
-
-
- 符号-数据矩阵
-
- .icon-shujujuzhen
-
-
-
- -
-
-
- 视图矩阵_o
-
- .icon-shitujuzhen_o
-
-
-
- -
-
-
- 悬浮
-
- .icon-xuanfu1
-
-
-
- -
-
-
- 右悬浮-选中
-
- .icon-youxuanfu-copy
-
-
-
- -
-
-
- 悬浮
-
- .icon-xuanfu
-
-
-
- -
-
-
- 悬浮按钮
-
- .icon-xuanfuanniu
-
-
-
- -
-
-
- 右悬浮-选中
-
- .icon-youxuanfu-copy-copy
-
-
-
- -
-
-
- 44.tabs
-
- .icon-tabs
-
-
-
- -
-
-
- 洗浴
-
- .icon-xiyu
-
-
-
- -
-
-
- 线性图标-取消下钻
-
- .icon-quxiaoshangzuan
-
-
-
- -
-
-
- 线性图标-取消下钻
-
- .icon-quxiaoxiazuan
-
-
-
- -
-
-
- 联动
-
- .icon-linkage
-
-
-
- -
-
-
- 下钻
-
- .icon-xiazuan
-
-
-
- -
-
-
- 上钻
-
- .icon-shangzuan
-
-
-
- -
-
-
- 取消联动
-
- .icon-quxiaoliandong
-
-
-
- -
-
-
- edit-2
-
- .icon-edit-outline
-
-
-
- -
-
-
- edit-2
-
- .icon-edit
-
-
-
- -
-
-
- 详情
-
- .icon-xiangqing1
-
-
-
- -
-
-
- 弧形框
-
- .icon-weibiaoti-1
-
-
-
- -
-
-
- 弧形框
-
- .icon-weibiaoti-
-
-
-
- -
-
-
- 透明
-
- .icon-touming
-
-
-
- -
-
-
- 弧度
-
- .icon-fangxing-
-
-
-
- -
-
-
- 放大
-
- .icon-fangda
-
-
-
- -
-
-
- 设 置
-
- .icon-shezhi
-
-
-
- -
-
-
- 屏幕_全屏
-
- .icon-quanping1
-
-
-
- -
-
-
- font-weight-bold
-
- .icon-font-weight-bold
-
-
-
- -
-
-
- letter_spacing
-
- .icon-letter_spacing
-
-
-
- -
-
-
- letter-spacing
-
- .icon-letter-spacing
-
-
-
- -
-
-
- 字体颜色
-
- .icon-zimua
-
-
-
- -
-
-
- format_letter_spacing_2
-
- .icon-format_letter_spacing_
-
-
-
- -
-
-
- font_size
-
- .icon-font_size
-
-
-
- -
-
-
- 居中
-
- .icon-align-center
-
-
-
- -
-
-
- 居右
-
- .icon-juyou
-
-
-
- -
-
-
- 居左
-
- .icon-juzuo
-
-
-
- -
-
-
- 实线
-
- .icon-solid_line
-
-
-
- -
-
-
- 画笔
-
- .icon-huabi
-
-
-
- -
-
-
- 点线
-
- .icon-dianxian
-
-
-
- -
-
-
- 虚线
-
- .icon-xuxian
-
-
-
- -
-
-
- 背景色‘
-
- .icon-beijingse1
-
-
-
- -
-
-
- 矩形
-
- .icon-juxing
-
-
-
- -
-
-
- text
-
- .icon-text
-
-
-
- -
-
-
- picture
-
- .icon-picture
-
-
-
- -
-
-
- 输入
-
- .icon-shuru
-
-
-
- -
-
-
- 树
-
- .icon-tree
-
-
-
- -
-
-
- 查询搜索
-
- .icon-chaxunsousuo
-
-
-
- -
-
-
- 季度
-
- .icon-jidu
-
-
-
- -
-
-
- 数字顺序
-
- .icon-shuzishunxu
-
-
-
- -
-
-
- 树列表
-
- .icon-Group-
-
-
-
- -
-
-
- 日期
-
- .icon-riqi
-
-
-
- -
-
-
- 左侧-区间
-
- .icon-zuoce-qujian
-
-
-
- -
-
-
- 列表
-
- .icon-liebiao
-
-
-
- -
-
-
- 下拉框
-
- .icon-xialakuang
-
-
-
- -
-
-
- 下拉树
-
- .icon-xialashu
-
-
-
- -
-
-
- 重置
-
- .icon-zhongzhi
-
-
-
- -
-
-
- 日
-
- .icon-ri
-
-
-
- -
-
-
- 年
-
- .icon-nian
-
-
-
- -
-
-
- 月
-
- .icon-yue
-
-
-
-
-
-
font-class 引用
-
-
-
font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。
-
与 Unicode 使用方式相比,具有如下特点:
-
- - 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
- - 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
-
-
使用步骤如下:
-
第一步:引入项目下面生成的 fontclass 代码:
-
<link rel="stylesheet" href="./iconfont.css">
-
-
第二步:挑选相应图标并获取类名,应用于页面:
-
<span class="iconfont icon-xxx"></span>
-
-
- "
- iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。
-
-
-
-
-
-
- -
-
-
application
- #icon-application
-
-
- -
-
-
data-source-24
- #icon-datasource-select
-
-
- -
-
-
重置
- #icon-zhongzhi2
-
-
- -
-
-
None_Select
- #icon-None_Select
-
-
- -
-
-
button_right
- #icon-button_right
-
-
- -
-
-
icon-maybe
- #icon-icon-maybe
-
-
- -
-
-
icon_up-left_outlined
- #icon-icon_up-left_outlined
-
-
- -
-
-
close
- #icon-close
-
-
- -
-
-
Frame 3425
- #icon-a-Frame3425
-
-
- -
-
-
icon-filter
- #icon-icon-filter
-
-
- -
-
-
icon_Batch_outlined
- #icon-icon_Batch_outlined
-
-
- -
-
-
icon_clear_outlined
- #icon-icon_clear_outlined
-
-
- -
-
-
icon_dialpad_outlined
- #icon-icon_dialpad_outlined
-
-
- -
-
-
icon_effects_outlined
- #icon-icon_effects_outlined
-
-
- -
-
-
icon_magnify_outlined
- #icon-icon_magnify_outlined
-
-
- -
-
-
icon_moments-categories_outlined
- #icon-icon_moments-categories_outlined
-
-
- -
-
-
icon_pc_outlined
- #icon-icon_pc_outlined
-
-
- -
-
-
icon_phone_outlined
- #icon-icon_phone_outlined
-
-
- -
-
-
icon_redo_outlined
- #icon-icon_redo_outlined
-
-
- -
-
-
icon_undo_outlined
- #icon-icon_undo_outlined
-
-
- -
-
-
icon-more
- #icon-icon-more
-
-
- -
-
-
icon-quicksetting
- #icon-icon-quicksetting
-
-
- -
-
-
square-selected
- #icon-square-selected
-
-
- -
-
-
italic
- #icon-italic
-
-
- -
-
-
箭头
- #icon-jiantou
-
-
- -
-
-
magic-line
- #icon-magic-line
-
-
- -
-
-
更多
- #icon-gengduo
-
-
- -
-
-
清空
- #icon-qingkong
-
-
- -
-
-
查看
- #icon-chakan
-
-
- -
-
-
outline-redo
- #icon-outline-redo
-
-
- -
-
-
outline-undo
- #icon-outline-undo
-
-
- -
-
-
定位
- #icon-dingwei
-
-
- -
-
-
富文本框
- #icon-fuwenbenkuang
-
-
- -
-
-
下架
- #icon-unpublish
-
-
- -
-
-
上架
- #icon-publish
-
-
- -
-
-
发布
- #icon-fabu
-
-
- -
-
-
批量操作
- #icon-piliang-copy
-
-
- -
-
-
图片
- #icon-tupian
-
-
- -
-
-
超链接
- #icon-chaolianjie1
-
-
- -
-
-
跳转
- #icon-com-jump
-
-
- -
-
-
跳转
- #icon-component-tiaozhuan
-
-
- -
-
-
网格\表格
- #icon-wangge-open
-
-
- -
-
-
关闭网格
- #icon-wangge-close
-
-
- -
-
-
流媒体,媒体列表
- #icon-a-liumeitimeitiliebiao
-
-
- -
-
-
iframe
- #icon-iframe
-
-
- -
-
-
参数
- #icon-canshu
-
-
- -
-
-
更换
- #icon-genghuan
-
-
- -
-
-
发送邮件
- #icon-fasongyoujian
-
-
- -
-
-
github
- #icon-github
-
-
- -
-
-
电话
- #icon-dianhua
-
-
- -
-
-
关闭
- #icon-guanbi
-
-
- -
-
-
矩形
- #icon-juxing1
-
-
- -
-
-
移动端
- #icon-yidongduan
-
-
- -
-
-
video
- #icon-video
-
-
- -
-
-
悬浮按钮发动态
- #icon-xuanfuanniufadongtai
-
-
- -
-
-
吸附选择
- #icon-xifuxuanze
-
-
- -
-
-
margin
- #icon-margin
-
-
- -
-
-
padding
- #icon-padding
-
-
- -
-
-
时间
- #icon-shijian
-
-
- -
-
-
时间格式转换
- #icon-shijiangeshizhuanhuan
-
-
- -
-
-
超链接
- #icon-chaolianjie
-
-
- -
-
-
科学技术
- #icon-kexuejishu
-
-
- -
-
-
符号-数据矩阵
- #icon-shujujuzhen
-
-
- -
-
-
视图矩阵_o
- #icon-shitujuzhen_o
-
-
- -
-
-
悬浮
- #icon-xuanfu1
-
-
- -
-
-
右悬浮-选中
- #icon-youxuanfu-copy
-
-
- -
-
-
悬浮
- #icon-xuanfu
-
-
- -
-
-
悬浮按钮
- #icon-xuanfuanniu
-
-
- -
-
-
右悬浮-选中
- #icon-youxuanfu-copy-copy
-
-
- -
-
-
44.tabs
- #icon-tabs
-
-
- -
-
-
洗浴
- #icon-xiyu
-
-
- -
-
-
线性图标-取消下钻
- #icon-quxiaoshangzuan
-
-
- -
-
-
线性图标-取消下钻
- #icon-quxiaoxiazuan
-
-
- -
-
-
联动
- #icon-linkage
-
-
- -
-
-
下钻
- #icon-xiazuan
-
-
- -
-
-
上钻
- #icon-shangzuan
-
-
- -
-
-
取消联动
- #icon-quxiaoliandong
-
-
- -
-
-
edit-2
- #icon-edit-outline
-
-
- -
-
-
edit-2
- #icon-edit
-
-
- -
-
-
详情
- #icon-xiangqing1
-
-
- -
-
-
弧形框
- #icon-weibiaoti-1
-
-
- -
-
-
弧形框
- #icon-weibiaoti-
-
-
- -
-
-
透明
- #icon-touming
-
-
- -
-
-
弧度
- #icon-fangxing-
-
-
- -
-
-
放大
- #icon-fangda
-
-
- -
-
-
设 置
- #icon-shezhi
-
-
- -
-
-
屏幕_全屏
- #icon-quanping1
-
-
- -
-
-
font-weight-bold
- #icon-font-weight-bold
-
-
- -
-
-
letter_spacing
- #icon-letter_spacing
-
-
- -
-
-
letter-spacing
- #icon-letter-spacing
-
-
- -
-
-
字体颜色
- #icon-zimua
-
-
- -
-
-
format_letter_spacing_2
- #icon-format_letter_spacing_
-
-
- -
-
-
font_size
- #icon-font_size
-
-
- -
-
-
居中
- #icon-align-center
-
-
- -
-
-
居右
- #icon-juyou
-
-
- -
-
-
居左
- #icon-juzuo
-
-
- -
-
-
实线
- #icon-solid_line
-
-
- -
-
-
画笔
- #icon-huabi
-
-
- -
-
-
点线
- #icon-dianxian
-
-
- -
-
-
虚线
- #icon-xuxian
-
-
- -
-
-
背景色‘
- #icon-beijingse1
-
-
- -
-
-
矩形
- #icon-juxing
-
-
- -
-
-
text
- #icon-text
-
-
- -
-
-
picture
- #icon-picture
-
-
- -
-
-
输入
- #icon-shuru
-
-
- -
-
-
树
- #icon-tree
-
-
- -
-
-
查询搜索
- #icon-chaxunsousuo
-
-
- -
-
-
季度
- #icon-jidu
-
-
- -
-
-
数字顺序
- #icon-shuzishunxu
-
-
- -
-
-
树列表
- #icon-Group-
-
-
- -
-
-
日期
- #icon-riqi
-
-
- -
-
-
左侧-区间
- #icon-zuoce-qujian
-
-
- -
-
-
列表
- #icon-liebiao
-
-
- -
-
-
下拉框
- #icon-xialakuang
-
-
- -
-
-
下拉树
- #icon-xialashu
-
-
- -
-
-
重置
- #icon-zhongzhi
-
-
- -
-
-
日
- #icon-ri
-
-
- -
-
-
年
- #icon-nian
-
-
- -
-
-
月
- #icon-yue
-
-
-
-
-
Symbol 引用
-
-
-
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
- 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:
-
- - 支持多色图标了,不再受单色限制。
- - 通过一些技巧,支持像字体那样,通过
font-size
, color
来调整样式。
- - 兼容性较差,支持 IE9+,及现代浏览器。
- - 浏览器渲染 SVG 的性能一般,还不如 png。
-
-
使用步骤如下:
-
第一步:引入项目下面生成的 symbol 代码:
-
<script src="./iconfont.js"></script>
-
-
第二步:加入通用 CSS 代码(引入一次就行):
-
<style>
-.icon {
- width: 1em;
- height: 1em;
- vertical-align: -0.15em;
- fill: currentColor;
- overflow: hidden;
-}
-</style>
-
-
第三步:挑选相应图标并获取类名,应用于页面:
-
<svg class="icon" aria-hidden="true">
- <use xlink:href="#icon-xxx"></use>
-</svg>
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/styles/vdrr/common.scss b/frontend/src/styles/vdrr/common.scss
deleted file mode 100644
index b003d6c898..0000000000
--- a/frontend/src/styles/vdrr/common.scss
+++ /dev/null
@@ -1,123 +0,0 @@
-* {
- padding: 0;
- margin: 0;
-}
-
-// 滚动条
-::-webkit-scrollbar {
- width: 4px;
- height: 4px;
-}
-
-::-webkit-scrollbar-thumb {
- box-shadow: inset 0 0 5px rgba(0, 0, 0, .5);
- border-radius: 10px;
- background: #ffffff;
-}
-
-::-webkit-scrollbar-track {
- border-radius: 10px;
- box-shadow: inset 0 0 5px rgba(0, 0, 0, .5);
- background: #141414;
-}
-
-// 文字对齐
-.text-left {
- text-align: left;
-}
-
-.text-center {
- text-align: center;
-}
-
-.text-right {
- text-align: right;
-}
-
-// 首页
-#app {
- display: flex;
- flex-direction: row;
-
-}
-
-#menu {
- width: 275px;
- min-width: 200px;
- max-width: 500px;
- height: 100vh;
- overflow-y: auto;
- overflow-x: hidden;
-
- .el-menu {
- border: none;
-
- .el-submenu__title {
- height: 40px;
- line-height: 40px;
- }
-
- .el-menu-item {
- height: 28px;
- line-height: 28px;
- }
- }
-}
-
-#view {
- flex: 1;
- min-width: 500px;
- padding: 10px 35px 0 35px;
- height: 100vh;
- overflow-y: auto;
- overflow-x: hidden;
- display: flex;
- flex-direction: column;
- align-items: center;
- box-sizing: border-box;
- position: relative;
-}
-
-
-.drag-bar {
- position: absolute;
- top: 0;
- left: 0;
- height: 100vh;
- width: 5px;
- z-index: 99;
- border-left: 1px solid #ccc;
- cursor: ew-resize
-}
-
-.view-box {
- width: 100%;
-}
-
-#toolbar {
- left: 0;
- top: 0;
- height: 24px;
- padding: 5px;
- border: 1px solid #999;
- border-bottom: none;
- background-color: #CCC;
- z-index: 999;
-}
-
-.container {
- width: 100%;
- height: 600px;
- border: 1px solid #000;
-
- position: relative;
- box-sizing: border-box
-}
-
-.vdr {
- border: 1px dashed;
-}
-
-.vdrr {
- border: 1px dashed;
-}
diff --git a/frontend/src/styles/vdrr/customize.scss b/frontend/src/styles/vdrr/customize.scss
deleted file mode 100644
index f7265b502f..0000000000
--- a/frontend/src/styles/vdrr/customize.scss
+++ /dev/null
@@ -1,147 +0,0 @@
-.pattern-contaienr {
- border: 1px solid #ccc;
- width: 576px;
- height: 324px;
-}
-
-.iconPistion {
- border-width: 2px;
- border-style: solid;
- border-color: #409eff;
- background-color: rgba(128, 128, 128, 0.5);
- box-sizing: border-box;
-
- .icon-slot {
- font-size: 12px;
- }
-}
-
-.patternContent {
- display: flex;
-
- .patternLeft {
- margin: 10px;
- }
-
- .patternRight {
- width: 400px;
- margin: 10px;
- }
-}
-
-
-.icon-slot {
- width: 100%;
- height: 100%;
-
- .status {
- text-align: left;
- color: #000;
- }
-
- .order {
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
- }
-}
-
-.activePattern {
- border-style: solid;
- border-color: #08de05;
-}
-
-
-.drag-handle,
-.drag-cancel {
- padding: 6px;
- margin: 6px;
- background-color: #CCC;
- border: 2px solid;
-}
-
-.drag-handle:hover {
- cursor: move;
-}
-
-.drag-cancel:hover {
- cursor: not-allowed;
-}
-
-.my-handle-class {
- position: absolute;
- border: 1px solid black;
- border-radius: 50%;
- height: 14px;
- width: 14px;
- font-size: 1em;
- line-height: 1em;
- box-sizing: border-box;
- -webkit-transition: all 300ms linear;
- -ms-transition: all 300ms linear;
- transition: all 300ms linear;
-}
-
-.my-handle-class-tl {
- top: -14px;
- left: -14px;
- cursor: nw-resize;
-}
-
-.my-handle-class-tm {
- top: -14px;
- left: 50%;
- margin-left: -7px;
- cursor: n-resize;
-}
-
-.my-handle-class-tr {
- top: -14px;
- right: -14px;
- cursor: ne-resize;
-}
-
-.my-handle-class-ml {
- top: 50%;
- margin-top: -7px;
- left: -14px;
- cursor: w-resize;
-}
-
-.my-handle-class-mr {
- top: 50%;
- margin-top: -7px;
- right: -14px;
- cursor: e-resize;
-}
-
-.my-handle-class-bl {
- bottom: -14px;
- left: -14px;
- cursor: sw-resize;
-}
-
-.my-handle-class-bm {
- bottom: -14px;
- left: 50%;
- margin-left: -7px;
- cursor: s-resize;
-}
-
-.my-handle-class-br {
- bottom: -14px;
- right: -14px;
- cursor: se-resize;
-}
-
-.my-handle-class-tl:hover,
-.my-handle-class-tm:hover,
-.my-handle-class-tr:hover,
-.my-handle-class-ml:hover,
-.my-handle-class-mr:hover,
-.my-handle-class-bl:hover,
-.my-handle-class-bm:hover,
-.my-handle-class-br:hover {
- transform: scale(1.4);
-}
diff --git a/frontend/src/styles/vdrr/highlight.scss b/frontend/src/styles/vdrr/highlight.scss
deleted file mode 100644
index 766e70839a..0000000000
--- a/frontend/src/styles/vdrr/highlight.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-// 添加行号样式
-pre.hljs {
- padding: 8px 2px;
- border-radius: 5px;
- position: relative;
-
- ol {
- list-style: decimal;
- margin: 0;
- margin-left: 40px;
- padding: 0;
-
- li {
- list-style: decimal-leading-zero;
- position: relative;
- padding-left: 10px;
-
- .line-num {
- position: absolute;
- left: -40px;
- top: 0;
- width: 40px;
- height: 100%;
- border-right: 1px solid rgba(0, 0, 0, .66);
- }
- }
- }
-
- b.name {
- position: absolute;
- top: 2px;
- right: 12px;
- z-index: 10;
- color: #999;
- pointer-events: none;
- }
-}
-
-
-
-span.hljs-tag,
-span.hljs-name {
- color: #eb333c;
-}
-
-
-span.hljs-string {
- color: #b4aa34;
-
-}
\ No newline at end of file
diff --git a/frontend/src/styles/vdrr/markdown.scss b/frontend/src/styles/vdrr/markdown.scss
deleted file mode 100644
index a278a71075..0000000000
--- a/frontend/src/styles/vdrr/markdown.scss
+++ /dev/null
@@ -1,247 +0,0 @@
-.markdown-render {
- html {
- font-size: 16px;
- }
-
- body {
- font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
- color: rgb(51, 51, 51);
- line-height: 1.6;
- }
-
- a {
- color: #4183C4;
- }
-
- h1,
- h2,
- h3,
- h4,
- h5,
- h6 {
- position: relative;
- margin-top: 1rem;
- margin-bottom: 1rem;
- font-weight: bold;
- line-height: 1.4;
- cursor: text;
- }
-
- h1:hover a.anchor,
- h2:hover a.anchor,
- h3:hover a.anchor,
- h4:hover a.anchor,
- h5:hover a.anchor,
- h6:hover a.anchor {
- text-decoration: none;
- }
-
- h1 tt,
- h1 code {
- font-size: inherit;
- }
-
- h2 tt,
- h2 code {
- font-size: inherit;
- }
-
- h3 tt,
- h3 code {
- font-size: inherit;
- }
-
- h4 tt,
- h4 code {
- font-size: inherit;
- }
-
- h5 tt,
- h5 code {
- font-size: inherit;
- }
-
- h6 tt,
- h6 code {
- font-size: inherit;
- }
-
- h1 {
- padding-bottom: .3em;
- font-size: 2.0m;
- line-height: 1.2;
- border-bottom: 1px solid #eee;
- }
-
- h2 {
- padding-bottom: .3em;
- font-size: 1.66em;
- line-height: 1.225;
- border-bottom: 1px solid #eee;
- }
-
- h3 {
- font-size: 1.33em;
- line-height: 1.43;
- }
-
- h4 {
- font-size: 1.11em;
- }
-
- h5 {
- font-size: 1em;
- }
-
- h6 {
- font-size: .8m;
- color: #777;
- }
-
- p,
- blockquote,
- ul,
- ol,
- dl,
- table {
- margin: 0.8em 0;
- }
-
- li>ol,
- li>ul {
- margin: 0 0;
- }
-
- hr {
- height: 2px;
- padding: 0;
- margin: 16px 0;
- background-color: #e7e7e7;
- border: 0 none;
- overflow: hidden;
- box-sizing: content-box;
- }
-
- li p.first {
- display: inline-block;
- }
-
- ul,
- ol {
- padding-left: 30px;
- }
-
- ul:first-child,
- ol:first-child {
- margin-top: 0;
- }
-
- ul:last-child,
- ol:last-child {
- margin-bottom: 0;
- }
-
- blockquote {
- border-left: 4px solid #dfe2e5;
- padding: 0 15px;
- color: #777777;
- }
-
- blockquote blockquote {
- padding-right: 0;
- }
-
- table {
- padding: 0;
- word-break: initial;
- }
-
- table tr {
- border-top: 1px solid #dfe2e5;
- margin: 0;
- padding: 0;
- }
-
- table tr:nth-child(2n),
- thead {
- background-color: #f8f8f8;
- }
-
- table tr th {
- font-weight: bold;
- border: 1px solid #dfe2e5;
- border-bottom: 0;
- margin: 0;
- padding: 6px 13px;
- }
-
- table tr td {
- border: 1px solid #dfe2e5;
- margin: 0;
- padding: 6px 13px;
- }
-
- table tr th:first-child,
- table tr td:first-child {
- margin-top: 0;
- }
-
- table tr th:last-child,
- table tr td:last-child {
- margin-bottom: 0;
- }
-
- tt {
- border: 1px solid #e7eaed;
- background-color: #f8f8f8;
- border-radius: 3px;
- padding: 0;
- padding: 2px 4px 0px 4px;
- font-size: .9em;
- }
-
- code {
- background-color: #f3f4f4;
- padding: 0 2px 0 2px;
- font-size: 16px;
- }
-
-
- @media print {
- html {
- font-size: 13px;
- }
-
- table,
- pre {
- page-break-inside: avoid;
- }
-
- pre {
- word-wrap: break-word;
- }
- }
-
-
-
- pre {
- padding: 1rem;
- font-size: 100%;
- line-height: 1.45;
- background-color:#f7f7f7;
- border: 0;
- border-radius: 3px;
- color: #777777;
- margin-top: 0 !important;
- }
-
- blockquote {
- border-left-color: rgba(85, 85, 85, 0.12);
- }
-
- header,
- footer {
- font-family: "Segoe UI", "Arial", sans-serif;
- }
-
-}
\ No newline at end of file
From e28b80f302d91b4772e7d4ea0b0b7eca4f85e652 Mon Sep 17 00:00:00 2001
From: dataeaseShu <106045316+dataeaseShu@users.noreply.github.com>
Date: Tue, 8 Nov 2022 18:12:36 +0800
Subject: [PATCH 08/44] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E9=9B=86?=
=?UTF-8?q?=E5=AF=BC=E5=87=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/views/dataset/data/ViewTable.vue | 51 +-
.../dataset/data/components/filterFiled.vue | 1060 +++++++++++++++++
.../views/dataset/data/components/rowAuth.vue | 350 ++++++
.../dataset/data/components/rowAuthTree.vue | 251 ++++
frontend/src/views/dataset/data/options.js | 24 +
5 files changed, 1725 insertions(+), 11 deletions(-)
create mode 100644 frontend/src/views/dataset/data/components/filterFiled.vue
create mode 100644 frontend/src/views/dataset/data/components/rowAuth.vue
create mode 100644 frontend/src/views/dataset/data/components/rowAuthTree.vue
create mode 100644 frontend/src/views/dataset/data/options.js
diff --git a/frontend/src/views/dataset/data/ViewTable.vue b/frontend/src/views/dataset/data/ViewTable.vue
index b78ea0c3d2..bc40625337 100644
--- a/frontend/src/views/dataset/data/ViewTable.vue
+++ b/frontend/src/views/dataset/data/ViewTable.vue
@@ -190,7 +190,7 @@
v-dialogDrag
:visible.sync="showExport"
width="600px"
- class="de-dialog-form"
+ class="de-dialog-form form-tree-cont"
:title="$t('dataset.export_dataset')"
append-to-body
>
@@ -216,11 +216,9 @@
:label="$t('dataset.export_filter')"
prop="expressionTree"
>
-
-
+
+
+
提示:最多支持导出10万条数据
@@ -251,6 +249,8 @@ import FieldEdit from './FieldEdit'
import { pluginLoaded } from '@/api/user'
import PluginCom from '@/views/system/plugin/PluginCom'
import UpdateRecords from './UpdateRecords'
+import rowAuth from './components/rowAuth.vue'
+
export default {
name: 'ViewTable',
components: {
@@ -259,8 +259,14 @@ export default {
UpdateInfo,
TabDataPreview,
UpdateRecords,
+ rowAuth,
PluginCom
},
+ provide() {
+ return {
+ filedList: () => this.filedList
+ }
+ },
props: {
param: {
type: Object,
@@ -273,6 +279,7 @@ export default {
name: ''
},
fields: [],
+ filedList: [],
data: [],
syncStatus: '',
lastRequestComplete: true,
@@ -289,8 +296,7 @@ export default {
isPluginLoaded: false,
showExport: false,
exportForm: {
- name: '',
- expressionTree: ''
+ name: ''
},
exportFormRules: {
name: [
@@ -345,6 +351,13 @@ export default {
this.initTable(this.param.id)
},
methods: {
+ fetchFiledList() {
+ this.filedList = []
+ post('dataset/field/listForPermissionSeting/' + this.param.id,
+ {}).then((res) => {
+ this.filedList = res.data
+ })
+ },
initTable(id) {
this.resetPage()
this.tableViewRowForm.row = 1000
@@ -455,8 +468,8 @@ export default {
exportDataset() {
this.showExport = true
+ this.fetchFiledList()
this.exportForm.name = this.table.name
- this.exportForm.expressionTree = ''
},
closeExport() {
this.showExport = false
@@ -467,7 +480,16 @@ export default {
if (this.table.id) {
this.table.row = 100000
this.table.filename = this.exportForm.name
- this.table.expressionTree = this.exportForm.expressionTree
+ const { logic, items, errorMessage } = this.$refs.rowAuth.submit()
+ if (errorMessage) {
+ this.$message({
+ message: errorMessage,
+ type: 'error',
+ showClose: true
+ })
+ return
+ }
+ this.table.expressionTree = JSON.stringify({ items, logic })
exportDataset(this.table).then((res) => {
const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
const link = document.createElement('a')
@@ -488,7 +510,14 @@ export default {
}
-
+
+
diff --git a/frontend/src/views/dataset/data/components/rowAuth.vue b/frontend/src/views/dataset/data/components/rowAuth.vue
new file mode 100644
index 0000000000..e480e91405
--- /dev/null
+++ b/frontend/src/views/dataset/data/components/rowAuth.vue
@@ -0,0 +1,350 @@
+
+
+
del(idx)"
+ @addCondReal="addCondReal"
+ @removeRelationList="removeRelationList"
+ @changeAndOrDfs="(type) => changeAndOrDfs(relationList, type)"
+ />
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/dataset/data/components/rowAuthTree.vue b/frontend/src/views/dataset/data/components/rowAuthTree.vue
new file mode 100644
index 0000000000..d57c4dc971
--- /dev/null
+++ b/frontend/src/views/dataset/data/components/rowAuthTree.vue
@@ -0,0 +1,251 @@
+
+
+
+
+
+ {{ logic === 'or' ? "OR" : "AND" }}
+
+
+
+ {{ logic === 'or' ? "OR" : "AND" }}
+
+
+ AND
+ OR
+
+
+
+
+
+
+
+
+
+ del(idx, item.child)"
+ @addCondReal="(type, logic) => add(type, item.child, logic)"
+ @removeRelationList="removeRelationList(index)"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/views/dataset/data/options.js b/frontend/src/views/dataset/data/options.js
new file mode 100644
index 0000000000..36a1f426bc
--- /dev/null
+++ b/frontend/src/views/dataset/data/options.js
@@ -0,0 +1,24 @@
+function formatEnum(ele) {
+ return {
+ value: ele,
+ label: `chart.filter_${ele.replace(' ', '_')}`
+ }
+}
+
+const textEnum = ['eq', 'not_eq', 'like', 'not like', 'null', 'not_null', 'empty', 'not_empty']
+const textOptions = textEnum.map(formatEnum)
+
+const dateEnum = ['eq', 'not_eq', 'lt', 'gt', 'le', 'ge']
+const dateOptions = dateEnum.map(formatEnum)
+
+const valueEnum = [...dateEnum]
+const valueOptions = valueEnum.map(formatEnum)
+
+const fieldEnum = ['text', 'time', 'value', 'value', '', 'location']
+
+export {
+ textOptions,
+ dateOptions,
+ valueOptions,
+ fieldEnum
+}
From d2f9d59af4dde84a1e078457242707a4e2ddaa3c Mon Sep 17 00:00:00 2001
From: junjun
Date: Tue, 8 Nov 2022 20:19:49 +0800
Subject: [PATCH 09/44] =?UTF-8?q?feat(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E5=AF=BC=E5=87=BAExcel?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/io/dataease/service/dataset/DataSetTableService.java | 1 +
.../io/dataease/service/dataset/PermissionsTreeService.java | 2 +-
frontend/src/views/dataset/data/ViewTable.vue | 2 ++
3 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
index 7849c86d69..d7ddee0749 100644
--- a/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/DataSetTableService.java
@@ -2886,6 +2886,7 @@ public class DataSetTableService {
if (StringUtils.isNotEmpty(request.getExpressionTree())) {
Gson gson = new Gson();
tree = gson.fromJson(request.getExpressionTree(), DatasetRowPermissionsTreeObj.class);
+ permissionsTreeService.getField(tree);
}
Map previewData = getPreviewData(request, 1, 100000, null, tree);
List fields = (List) previewData.get("fields");
diff --git a/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java b/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java
index 54350dd09b..040e26d6fe 100644
--- a/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java
+++ b/backend/src/main/java/io/dataease/service/dataset/PermissionsTreeService.java
@@ -153,7 +153,7 @@ public class PermissionsTreeService {
return result;
}
- private void getField(DatasetRowPermissionsTreeObj tree) {
+ public void getField(DatasetRowPermissionsTreeObj tree) {
if (ObjectUtils.isNotEmpty(tree)) {
if (ObjectUtils.isNotEmpty(tree.getItems())) {
for (DatasetRowPermissionsTreeItem item : tree.getItems()) {
diff --git a/frontend/src/views/dataset/data/ViewTable.vue b/frontend/src/views/dataset/data/ViewTable.vue
index bc40625337..b22355bc22 100644
--- a/frontend/src/views/dataset/data/ViewTable.vue
+++ b/frontend/src/views/dataset/data/ViewTable.vue
@@ -187,6 +187,7 @@
Date: Wed, 9 Nov 2022 10:42:27 +0800
Subject: [PATCH 10/44] =?UTF-8?q?fix:=20=E6=96=87=E4=BB=B6=E5=90=8D?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AF=BC=E8=87=B4=E7=9A=84=E6=8F=92=E4=BB=B6?=
=?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=94=99=E8=AF=AF=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/store/modules/permission.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/frontend/src/store/modules/permission.js b/frontend/src/store/modules/permission.js
index b31cab2efe..cb1cfd889a 100644
--- a/frontend/src/store/modules/permission.js
+++ b/frontend/src/store/modules/permission.js
@@ -29,7 +29,7 @@ const actions = {
commit('SET_CURRENT_PATH', path)
}
}
-export const fullScreenRouters = ['XpackThemeForm', 'system/datasource/DsForm', 'dataset/form']
+export const fullScreenRouters = ['XpackThemeForm', 'system/datasource/DsForm', 'dataset/Form']
export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由字符串,转换为组件对象
return routers.map(router => {
if (!fullScreenRouters.includes(router.component) && router.type === 1 && router.pid === 0 && router.component && router.component !== 'Layout') {
@@ -37,7 +37,7 @@ export const filterAsyncRouter = (routers) => { // 遍历后台传来的路由
}
if (router.isPlugin) {
const jsName = router.component
- router.component = 'system/plugin/dynamic'
+ router.component = 'system/plugin/Dynamic'
router.props = {
jsname: jsName,
menuid: router.id,
From 56d25af37c98283e901cb28238f70f7f78855e1b Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Wed, 9 Nov 2022 10:45:48 +0800
Subject: [PATCH 11/44] =?UTF-8?q?feat(=E8=BF=87=E6=BB=A4=E5=99=A8):=20?=
=?UTF-8?q?=E6=97=A5=E6=9C=9F=E8=8C=83=E5=9B=B4=E8=BF=87=E6=BB=A4=E5=99=A8?=
=?UTF-8?q?=E5=8A=A8=E6=80=81=E6=97=B6=E9=97=B4=E5=8F=AF=E8=AE=BE=E7=BD=AE?=
=?UTF-8?q?=E5=9B=BA=E5=AE=9A=E6=97=B6=E5=88=86=E7=A7=92?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../serviceImpl/TimeDateRangeServiceImpl.js | 32 ++++++++++
frontend/src/styles/index.scss | 2 +-
.../defaultValue/DeDateRangeDefault.vue | 62 +++++++++++++++++--
.../panel/filter/filterMain/FilterControl.vue | 5 +-
4 files changed, 94 insertions(+), 7 deletions(-)
diff --git a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
index ec41b71476..94dcb6321e 100644
--- a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
+++ b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
@@ -222,6 +222,10 @@ class TimeDateRangeServiceImpl extends WidgetService {
}
}
dynamicDateFormNow(element) {
+ const values = this.dynamicDateFormNowProxy(element)
+ return this.formatDynamicTimes(values, element)
+ }
+ dynamicDateFormNowProxy(element) {
if (element.options.attrs.default === null || typeof element.options.attrs.default === 'undefined' || !element.options.attrs.default.isDynamic) return null
if (element.options.attrs.default.dkey === 0) {
@@ -265,6 +269,34 @@ class TimeDateRangeServiceImpl extends WidgetService {
return [startTime, endTime]
}
}
+
+ formatDynamicTimes(values, element) {
+ if (!values || !values.length || !element.options.attrs.default.isDynamic) {
+ return values
+ }
+ const baseTime = new Date('2022-11-09 00:00:00.000').getTime()
+ let labelFormat = 'yyyy-MM-dd'
+ if (element.options.attrs.showTime && element.options.attrs.accuracy) {
+ labelFormat = labelFormat + ' ' + element.options.attrs.accuracy
+ }
+ let start = values[0]
+ let end = values[1]
+ const attrs = element.options.attrs
+
+ if (attrs.default.sDynamicSuffixTime && attrs.default.isDynamic && attrs.default.dkey === 4 && attrs.showTime) {
+ start = attrs.default.sDynamicSuffixTime - baseTime + timeSection(start, 'date')[0]
+ } else {
+ start = timeSection(start, 'date', labelFormat)[0]
+ }
+ if (attrs.default.eDynamicSuffixTime && attrs.default.isDynamic && attrs.default.dkey === 4 && attrs.showTime) {
+ end = attrs.default.eDynamicSuffixTime - baseTime + timeSection(end, 'date')[0]
+ } else {
+ end = timeSection(end, 'date', labelFormat)[1]
+ }
+
+ const results = [start, end]
+ return results
+ }
validDynamicValue(element) {
if (!element.options.attrs.default.isDynamic) return true
if (element.options.attrs.default.dkey !== 4) return true
diff --git a/frontend/src/styles/index.scss b/frontend/src/styles/index.scss
index 3b1b8cfb1d..c7cf1088bc 100644
--- a/frontend/src/styles/index.scss
+++ b/frontend/src/styles/index.scss
@@ -770,7 +770,7 @@ div:focus {
.no-label-item {
.el-form-item__content {
- margin-left: 10px !important;
+ margin-left: 5px !important;
}
}
diff --git a/frontend/src/views/panel/filter/defaultValue/DeDateRangeDefault.vue b/frontend/src/views/panel/filter/defaultValue/DeDateRangeDefault.vue
index a43ca1ea5a..50f4324659 100644
--- a/frontend/src/views/panel/filter/defaultValue/DeDateRangeDefault.vue
+++ b/frontend/src/views/panel/filter/defaultValue/DeDateRangeDefault.vue
@@ -13,10 +13,8 @@
@change="dynamicChange"
>
{{ $t('dynamic_time.fix') }}
- {{ $t('dynamic_time.dynamic') }}
+ {{ $t('dynamic_time.dynamic') }}
+
@@ -82,6 +80,7 @@
>
+
+
+
+
@@ -153,6 +169,7 @@
>
+
+
+
+
time[0] || this.isOneDay))
this.element.options.manualModify = false
+ },
+
+ fillEmptySuffixTime() {
+ if (!this.element.options.attrs.default.sDynamicSuffixTime) {
+ this.$set(this.element.options.attrs.default, 'sDynamicSuffixTime', this.baseTime)
+ }
+
+ if (!this.element.options.attrs.default.eDynamicSuffixTime) {
+ this.$set(this.element.options.attrs.default, 'eDynamicSuffixTime', new Date('2022-11-09 23:59:59.999').getTime())
+ }
+ },
+ eDynamicSuffixTimeChange(val) {
+ this.setDval()
+ },
+ sDynamicSuffixTimeChange(val) {
+ this.setDval()
}
}
}
diff --git a/frontend/src/views/panel/filter/filterMain/FilterControl.vue b/frontend/src/views/panel/filter/filterMain/FilterControl.vue
index d4234d9e74..4067341c30 100644
--- a/frontend/src/views/panel/filter/filterMain/FilterControl.vue
+++ b/frontend/src/views/panel/filter/filterMain/FilterControl.vue
@@ -270,7 +270,10 @@ export default {
},
showTimeChange(value) {
this.attrs.accuracy = this.accuracyOptions[1].id
- this.attrs.default.isDynamic = false
+ if (this.widget.name !== 'timeDateRangeWidget') {
+ this.attrs.default.isDynamic = false
+ }
+
this.fillAttrs2Filter()
},
checkedViewsChange(values) {
From 2e7a268d5504e275a1adafcb8a671209db69ec76 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Wed, 9 Nov 2022 10:50:42 +0800
Subject: [PATCH 12/44] =?UTF-8?q?perf(=E6=95=B0=E6=8D=AE=E9=9B=86):=20?=
=?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E9=9B=86=E8=A1=A8=E5=8D=95?=
=?UTF-8?q?=E8=B7=AF=E7=94=B1=E9=A9=BC=E5=B3=B0=E5=91=BD=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/src/main/resources/db/migration/V44__1.17.sql | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/backend/src/main/resources/db/migration/V44__1.17.sql b/backend/src/main/resources/db/migration/V44__1.17.sql
index 833626b004..13a33cb876 100644
--- a/backend/src/main/resources/db/migration/V44__1.17.sql
+++ b/backend/src/main/resources/db/migration/V44__1.17.sql
@@ -1,4 +1,6 @@
ALTER TABLE `sys_log`
CHANGE COLUMN `user_id` `user_id` BIGINT NULL COMMENT '操作人',
CHANGE COLUMN `login_name` `login_name` VARCHAR (255) NULL COMMENT '登录账号',
- CHANGE COLUMN `nick_name` `nick_name` VARCHAR (255) NULL COMMENT '姓名';
\ No newline at end of file
+ CHANGE COLUMN `nick_name` `nick_name` VARCHAR (255) NULL COMMENT '姓名';
+
+UPDATE `sys_menu` SET `component` = 'dataset/Form' WHERE (`menu_id` = '800');
From e76788780af47a0a1e917084774dac14a9536450 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw <67260074+fit2cloud-chenyw@users.noreply.github.com>
Date: Wed, 9 Nov 2022 10:59:02 +0800
Subject: [PATCH 13/44] =?UTF-8?q?perf(=E8=BF=87=E6=BB=A4=E5=99=A8):?=
=?UTF-8?q?=E6=8C=89review=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../widget/serviceImpl/TimeDateRangeServiceImpl.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
index 94dcb6321e..c411217f3e 100644
--- a/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
+++ b/frontend/src/components/widget/serviceImpl/TimeDateRangeServiceImpl.js
@@ -271,16 +271,16 @@ class TimeDateRangeServiceImpl extends WidgetService {
}
formatDynamicTimes(values, element) {
- if (!values || !values.length || !element.options.attrs.default.isDynamic) {
+ if (!values?.length || !element.options.attrs.default.isDynamic) {
return values
}
- const baseTime = new Date('2022-11-09 00:00:00.000').getTime()
+ const baseTime = +new Date('2022-11-09 00:00:00.000')
let labelFormat = 'yyyy-MM-dd'
if (element.options.attrs.showTime && element.options.attrs.accuracy) {
labelFormat = labelFormat + ' ' + element.options.attrs.accuracy
}
- let start = values[0]
- let end = values[1]
+ let [ start, end ] = values
+
const attrs = element.options.attrs
if (attrs.default.sDynamicSuffixTime && attrs.default.isDynamic && attrs.default.dkey === 4 && attrs.showTime) {
From a4eef89197434624a7f141d5e3c6f6d793e06e35 Mon Sep 17 00:00:00 2001
From: fit2cloud-chenyw
Date: Wed, 9 Nov 2022 11:47:21 +0800
Subject: [PATCH 14/44] =?UTF-8?q?perf(=E7=99=BB=E5=BD=95):=20=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E5=8F=B3=E4=BE=A7=E5=9B=BE=E7=89=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/assets/login-desc.png | Bin 268423 -> 278607 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/frontend/src/assets/login-desc.png b/frontend/src/assets/login-desc.png
index b296cf257476226f7c27590e73745bd9a7515c6e..bf078d5564b7799a78c2eda46c6a354a1d7631f6 100644
GIT binary patch
literal 278607
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%0D-}xx>OY@DB%7f$Py*s8kM2>%e^cD`
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 |