From 47f6fc87c75da9d29570f62c737648d5291462d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A5=94=E8=B7=91=E7=9A=84=E9=9D=A2=E6=9D=A1?=
<1262327911@qq.com>
Date: Tue, 5 Jul 2022 21:44:16 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=8A=A8=E6=80=81?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=BF=87=E6=BB=A4=E5=99=A8=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
package.json | 1 +
pnpm-lock.yaml | 6 +
.../Pages/MonacoEditor/index.hook.ts | 49 +++++
src/components/Pages/MonacoEditor/index.ts | 3 +
src/components/Pages/MonacoEditor/index.vue | 84 ++++++++
.../Pages/ThemeColorSelect/index.vue | 2 +-
src/hooks/useChartDataFetch.hook.ts | 28 ++-
.../Charts/Mores/WaterPolo/index.vue | 1 -
src/packages/index.d.ts | 10 +-
src/packages/public/publicConfig.ts | 2 +
src/plugins/icon.ts | 7 +-
src/settings/designSetting.ts | 2 +-
.../modules/chartEditStore/chartEditStore.ts | 3 +
src/utils/utils.ts | 44 +++-
.../components/ChartDataAjax/index.vue | 91 ++++----
.../ChartDataMatchingAndShow/index.vue | 114 ++++++----
.../components/ChartDataMonacoEditor/index.ts | 3 +
.../ChartDataMonacoEditor/index.vue | 195 ++++++++++++++++++
.../components/ChartDataStatic/index.vue | 2 +-
.../components/ChartData/index.d.ts | 1 +
20 files changed, 541 insertions(+), 107 deletions(-)
create mode 100644 src/components/Pages/MonacoEditor/index.hook.ts
create mode 100644 src/components/Pages/MonacoEditor/index.ts
create mode 100644 src/components/Pages/MonacoEditor/index.vue
create mode 100644 src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.ts
create mode 100644 src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMonacoEditor/index.vue
diff --git a/package.json b/package.json
index 7dd7c9ae..5b01c51f 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
"highlight.js": "^11.5.0",
"html2canvas": "^1.4.1",
"keymaster": "^1.6.2",
+ "monaco-editor": "^0.33.0",
"naive-ui": "2.30.3",
"pinia": "^2.0.13",
"screenfull": "^6.0.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index fa91d99d..4a73acf9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -34,6 +34,7 @@ specifiers:
keymaster: ^1.6.2
lodash: ~4.17.21
mockjs: ^1.1.0
+ monaco-editor: ^0.33.0
naive-ui: 2.30.3
pinia: ^2.0.13
plop: ^3.0.5
@@ -68,6 +69,7 @@ dependencies:
highlight.js: 11.5.1
html2canvas: 1.4.1
keymaster: 1.6.2
+ monaco-editor: 0.33.0
naive-ui: 2.30.3_vue@3.2.37
pinia: 2.0.14_vcmyupim4cga7k7f5hngmth5py
screenfull: 6.0.1
@@ -3756,6 +3758,10 @@ packages:
commander: 9.3.0
dev: true
+ /monaco-editor/0.33.0:
+ resolution: {integrity: sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==}
+ dev: false
+
/ms/2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
dev: true
diff --git a/src/components/Pages/MonacoEditor/index.hook.ts b/src/components/Pages/MonacoEditor/index.hook.ts
new file mode 100644
index 00000000..d68ef4de
--- /dev/null
+++ b/src/components/Pages/MonacoEditor/index.hook.ts
@@ -0,0 +1,49 @@
+import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
+
+export const useMonacoEditor = (language = 'json') => {
+ let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null
+ let initReadOnly = false
+ const updateVal = async (val: string) => {
+ monacoEditor?.setValue(val)
+ setTimeout(async () => {
+ initReadOnly && monacoEditor?.updateOptions({ readOnly: false })
+ // await monacoEditor?.getAction('editor.action.formatDocument')?.run()
+ initReadOnly && monacoEditor?.updateOptions({ readOnly: true })
+ }, 100)
+ }
+
+ const createEditor = (
+ el: HTMLElement | null,
+ editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}
+ ) => {
+ if (monacoEditor) {
+ return
+ }
+ initReadOnly = !!editorOption.readOnly
+ monacoEditor =
+ el &&
+ monaco.editor.create(el, {
+ language,
+ minimap: { enabled: false },
+ theme: 'vs-dark',
+ multiCursorModifier: 'ctrlCmd',
+ scrollbar: {
+ verticalScrollbarSize: 8,
+ horizontalScrollbarSize: 8
+ },
+ tabSize: 2,
+ automaticLayout: true, // 自适应宽高
+ ...editorOption
+ })
+ return monacoEditor
+ }
+ const onFormatDoc = () => {
+ monacoEditor?.getAction('editor.action.formatDocument').run()
+ }
+ return {
+ updateVal,
+ getEditor: () => monacoEditor,
+ createEditor,
+ onFormatDoc
+ }
+}
diff --git a/src/components/Pages/MonacoEditor/index.ts b/src/components/Pages/MonacoEditor/index.ts
new file mode 100644
index 00000000..12bc7e53
--- /dev/null
+++ b/src/components/Pages/MonacoEditor/index.ts
@@ -0,0 +1,3 @@
+import MonacoEditor from './index.vue';
+
+export { MonacoEditor };
diff --git a/src/components/Pages/MonacoEditor/index.vue b/src/components/Pages/MonacoEditor/index.vue
new file mode 100644
index 00000000..9c2dc43f
--- /dev/null
+++ b/src/components/Pages/MonacoEditor/index.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/Pages/ThemeColorSelect/index.vue b/src/components/Pages/ThemeColorSelect/index.vue
index 96ce958c..38c9d819 100644
--- a/src/components/Pages/ThemeColorSelect/index.vue
+++ b/src/components/Pages/ThemeColorSelect/index.vue
@@ -20,7 +20,7 @@
{{ appThemeDetail.name }}
-
中国色
+
中国色
(null)
let fetchInterval: any = 0
- const requestInterval = () => {
+ const requestIntervalFn = () => {
const chartEditStore = useChartEditStore()
- const { requestOriginUrl, requestInterval } = toRefs(
- chartEditStore.getRequestGlobalConfig
- )
+ const { requestOriginUrl, requestInterval } = toRefs(chartEditStore.getRequestGlobalConfig)
// 组件类型
const { chartFrame } = targetComponent.chartConfig
// 请求配置
- const { requestDataType, requestHttpType, requestUrl } = toRefs(
- targetComponent.data
- )
+ const { requestDataType, requestHttpType, requestUrl } = toRefs(targetComponent.data)
// 非请求类型
if (requestDataType.value !== RequestDataTypeEnum.AJAX) return
// 处理地址
if (requestUrl?.value && requestInterval.value > 0) {
// requestOriginUrl 允许为空
- const completePath =
- requestOriginUrl && requestOriginUrl.value + requestUrl.value
+ const completePath = requestOriginUrl && requestOriginUrl.value + requestUrl.value
if (!completePath) return
+ clearInterval(fetchInterval)
+
const fetchFn = async () => {
const res: any = await http(requestHttpType.value)(completePath || '', {})
if (res.data) {
@@ -54,7 +52,8 @@ export const useChartDataFetch = (
// eCharts 组件配合 vChart 库更新方式
if (chartFrame === ChartFrameEnum.ECHARTS) {
if (vChartRef.value) {
- vChartRef.value.setOption({ dataset: res.data })
+ const filter = targetComponent.filter
+ vChartRef.value.setOption({ dataset: newFunctionHandle(res.data, filter) })
}
}
}
@@ -63,16 +62,15 @@ export const useChartDataFetch = (
}
}
}
-
+
// 立即调用
fetchFn()
// 开启定时
- setInterval(fetchFn, requestInterval.value * 1000)
+ fetchInterval = setInterval(fetchFn, requestInterval.value * 1000)
}
}
- isPreview() && requestInterval()
-
+ isPreview() && requestIntervalFn()
return { vChartRef }
}
diff --git a/src/packages/components/Charts/Mores/WaterPolo/index.vue b/src/packages/components/Charts/Mores/WaterPolo/index.vue
index 36af753b..06ee9099 100644
--- a/src/packages/components/Charts/Mores/WaterPolo/index.vue
+++ b/src/packages/components/Charts/Mores/WaterPolo/index.vue
@@ -74,7 +74,6 @@ const dataHandle = (newData: number) => {
watch(
() => props.chartConfig.option.dataset,
newData => {
- console.log(dataHandle(newData))
props.chartConfig.option.series[0].data = [dataHandle(newData)]
option.value = props.chartConfig.option
},
diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts
index 02c50e9b..8d27862e 100644
--- a/src/packages/index.d.ts
+++ b/src/packages/index.d.ts
@@ -2,9 +2,14 @@ import type { GlobalThemeJsonType } from '@/settings/chartThemes/index'
import type { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
export enum ChartFrameEnum {
- COMMON = 'common',
+ // echarts 框架
ECHARTS = 'echarts',
- NAIVE_UI = 'naiveUI'
+ // UI 组件框架
+ NAIVE_UI = 'naiveUI',
+ // 自定义带数据组件
+ COMMON = 'common',
+ // 无数据变更
+ STATIC = 'static'
}
// 组件配置
@@ -77,6 +82,7 @@ export interface PublicConfigType extends requestConfig {
// 动画
animations: string[]
}
+ filter?: string
setPosition: Function
}
diff --git a/src/packages/public/publicConfig.ts b/src/packages/public/publicConfig.ts
index 25d75d7f..05df5e28 100644
--- a/src/packages/public/publicConfig.ts
+++ b/src/packages/public/publicConfig.ts
@@ -45,6 +45,8 @@ export class publicConfig implements PublicConfigType {
public data = { ...requestConfig }
// 数据获取
public requestData = []
+ // 数据过滤
+ public filter = undefined
// 设置坐标
public setPosition(x: number, y: number): void {
diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts
index 7a9b3adf..cb016fce 100644
--- a/src/plugins/icon.ts
+++ b/src/plugins/icon.ts
@@ -52,7 +52,8 @@ import {
ArrowBack as ArrowBackIcon,
ArrowForward as ArrowForwardIcon,
Planet as PawIcon,
- Search as SearchIcon
+ Search as SearchIcon,
+ Filter as FilterIcon
} from '@vicons/ionicons5'
import {
@@ -190,7 +191,9 @@ const ionicons5 = {
// 狗爪
PawIcon,
// 搜索(放大镜)
- SearchIcon
+ SearchIcon,
+ // 过滤器
+ FilterIcon
}
const carbon = {
diff --git a/src/settings/designSetting.ts b/src/settings/designSetting.ts
index fe10d8ff..dfbd5d52 100644
--- a/src/settings/designSetting.ts
+++ b/src/settings/designSetting.ts
@@ -49,7 +49,7 @@ export const backgroundImageSize = 5
export const previewScaleType = PreviewScaleEnum.FIT
// 数据请求间隔
-export const requestInterval = 30
+export const requestInterval = 5
// 工作区域历史记录存储最大数量
export const editHistoryMax = 100
\ No newline at end of file
diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts
index a0b63abe..3803960d 100644
--- a/src/store/modules/chartEditStore/chartEditStore.ts
+++ b/src/store/modules/chartEditStore/chartEditStore.ts
@@ -167,6 +167,9 @@ export const useChartEditStore = defineStore({
},
// * 设置目标数据 select
setTargetSelectChart(selectId?: string | string[], push: boolean = false) {
+ // 重复选中
+ if(this.targetChart.selectId.find((e: string) => e === selectId)) return
+
// 无 id 清空
if(!selectId) {
this.targetChart.selectId = []
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index 51042dcc..ece61c43 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -5,6 +5,8 @@ import throttle from 'lodash/throttle'
import Image_404 from '../assets/images/exception/image-404.png'
import html2canvas from 'html2canvas'
import { downloadByA } from './file'
+import { isString } from './type'
+import cloneDeep from 'lodash/cloneDeep';
/**
* * 判断是否是开发环境
@@ -19,9 +21,7 @@ export const isDev = () => {
* @param { Number } randomLength
*/
export const getUUID = (randomLength = 10) => {
- return Number(
- Math.random().toString().substr(2, randomLength) + Date.now()
- ).toString(36)
+ return Number(Math.random().toString().substr(2, randomLength) + Date.now()).toString(36)
}
/**
@@ -90,10 +90,7 @@ export const screenfullFn = (isFullscreen?: boolean, isEnabled?: boolean) => {
* @param key 键名
* @param value 键值
*/
-export const setDomAttribute = <
- K extends keyof CSSStyleDeclaration,
- V extends CSSStyleDeclaration[K]
->(
+export const setDomAttribute = (
HTMLElement: HTMLElement,
key: K,
value: V
@@ -149,7 +146,7 @@ export const addEventListener = (
type,
throttle(listener, delay || 300, {
leading: true,
- trailing: false,
+ trailing: false
}),
options
)
@@ -186,3 +183,34 @@ export const canvasCut = (html: HTMLElement | null, callback?: Function) => {
if (callback) callback()
})
}
+
+/**
+ * * 函数过滤器
+ * @param data 数据值
+ * @param funcStr 函数字符串
+ * @param toString 转为字符串
+ * @param errorCallBack 错误回调函数
+ * @param successCallBack 成功回调函数
+ * @returns
+ */
+export const newFunctionHandle = (
+ data: any,
+ funcStr?: string,
+ toString?: boolean,
+ errorCallBack?: Function,
+ successCallBack?: Function
+) => {
+ try {
+ if (!funcStr) return data
+ const fn = new Function('data', funcStr)
+ const fnRes = fn( cloneDeep(data))
+ const resHandle = toString && isString(fnRes) ? JSON.stringify(fnRes) : fnRes
+ // 成功回调
+ successCallBack && successCallBack(resHandle)
+ return resHandle
+ } catch (error) {
+ // 失败回调
+ errorCallBack && errorCallBack(error)
+ return '函数执行错误'
+ }
+}
diff --git a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue
index 3098f6f1..c9e32045 100644
--- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue
+++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue
@@ -1,10 +1,7 @@
-
+
@@ -23,19 +20,26 @@
开发环境使用 mock 数据,请输入
-
- {{item.value}}
+ {{ item.value }}
-
+
-
+
+
+ 测试
+
+
+
+
+
+
+ 默认赋值给 dataset 字段
+
+
@@ -48,17 +52,13 @@
+
-
-
diff --git a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue
index 78f91e6e..d2867918 100644
--- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue
+++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataStatic/index.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts b/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts
index d12766ad..c6707bcb 100644
--- a/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts
+++ b/src/views/chart/ContentConfigurations/components/ChartData/index.d.ts
@@ -8,6 +8,7 @@ export enum DataResultEnum {
}
export enum TimelineTitleEnum {
+ FILTER = '数据过滤',
MAPPING = '数据映射',
CONTENT = '数据内容',
}