diff --git a/src/api/mock/index.ts b/src/api/mock/index.ts index a2474a61..d6c6ee98 100644 --- a/src/api/mock/index.ts +++ b/src/api/mock/index.ts @@ -4,27 +4,51 @@ import { RequestHttpEnum } from '@/enums/httpEnum' // 单个X数据 export const chartDataUrl = '/mock/chartData' -export const rankListUrl = '/mock/RankList' -export const numberUrl = '/mock/number' +export const numberFloatUrl = '/mock/number/float' +export const numberIntUrl = '/mock/number/int' +export const textUrl = '/mock/text' +export const imageUrl = '/mock/image' +export const rankListUrl = '/mock/rankList' +export const scrollBoardUrl = '/mock/scrollBoard' const mockObject: MockMethod[] = [ { // 正则 // url: /\/mock\/mockData(|\?\S*)$/, - url: '/mock/chartData', + url: chartDataUrl, method: RequestHttpEnum.GET, - response: () => test.fetchMockData, + response: () => test.fetchMockData }, { - url: '/mock/rankList', + url: numberFloatUrl, method: RequestHttpEnum.GET, - response: () => test.fetchRankList, + response: () => test.fetchNumberFloat }, { - url: '/mock/number', + url: numberIntUrl, method: RequestHttpEnum.GET, - response: () => test.fetchNumber, + response: () => test.fetchNumberInt }, + { + url: textUrl, + method: RequestHttpEnum.GET, + response: () => test.fetchText + }, + { + url: imageUrl, + method: RequestHttpEnum.GET, + response: () => test.fetchImage(Math.round(Math.random() * 10)) + }, + { + url: rankListUrl, + method: RequestHttpEnum.GET, + response: () => test.fetchRankList + }, + { + url: scrollBoardUrl, + method: RequestHttpEnum.GET, + response: () => test.fetchScrollBoard + } ] export default mockObject diff --git a/src/api/mock/test.mock.ts b/src/api/mock/test.mock.ts index 4f0478a6..404bbf90 100644 --- a/src/api/mock/test.mock.ts +++ b/src/api/mock/test.mock.ts @@ -10,35 +10,35 @@ export default { { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, + 'dataTwo|100-900': 3 }, { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, + 'dataTwo|100-900': 3 }, { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, + 'dataTwo|100-900': 3 }, { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, + 'dataTwo|100-900': 3 }, { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, + 'dataTwo|100-900': 3 }, { product: '@name', 'dataOne|100-900': 3, - 'dataTwo|100-900': 3, - }, - ], - }, + 'dataTwo|100-900': 3 + } + ] + } }, // 排名列表 fetchRankList: { @@ -58,14 +58,50 @@ export default { { name: '@name', 'value|100-900': 5 }, { name: '@name', 'value|100-900': 5 }, { name: '@name', 'value|100-900': 5 }, - { name: '@name', 'value|100-900': 5 }, - ], + { name: '@name', 'value|100-900': 5 } + ] }, - // 获取数字 - fetchNumber: { + // 轮播表格 + fetchScrollBoard: { code: 0, status: 200, msg: '请求成功', - data: '@float(0, 0.99)', + data: [ + ['行1列1', '行1列2', '1'], + ['行2列1', '行2列2', '2'], + ['行3列1', '行3列2', '3'], + ['行4列1', '行4列2', '4'], + ['行5列1', '行5列2', '5'], + ['行6列1', '行6列2', '6'], + ['行7列1', '行7列2', '行7列3'], + ['行8列1', '行8列2', '行8列3'], + ['行9列1', '行9列2', '行9列3'], + ['行10列1', '行10列2', '行10列3'] + ] }, + // 获取数字 + fetchNumberFloat: { + code: 0, + status: 200, + msg: '请求成功', + data: '@float(0, 0.99, 1, 4)' + }, + fetchNumberInt: { + code: 0, + status: 200, + msg: '请求成功', + data: '@integer(0, 100)' + }, + fetchText: { + code: 0, + status: 200, + msg: '请求成功', + data: '@paragraph(1, 10)' + }, + fetchImage: (num: number) => ({ + code: 0, + status: 200, + msg: '请求成功', + data: `https://robohash.org/${num}` + }) } diff --git a/src/assets/images/chart/charts/process.png b/src/assets/images/chart/charts/process.png index 4be18d73..e88df5a8 100644 Binary files a/src/assets/images/chart/charts/process.png and b/src/assets/images/chart/charts/process.png differ diff --git a/src/hooks/useChartDataFetch.hook.ts b/src/hooks/useChartDataFetch.hook.ts index ac522475..8fe65c5d 100644 --- a/src/hooks/useChartDataFetch.hook.ts +++ b/src/hooks/useChartDataFetch.hook.ts @@ -1,7 +1,7 @@ -import { ref, toRefs, watchEffect, nextTick } from 'vue' +import { ref, toRefs } from 'vue' import type VChart from 'vue-echarts' import { http } from '@/api/http' -import { CreateComponentType, PackagesCategoryEnum } from '@/packages/index.d' +import { CreateComponentType, ChartFrameEnum } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { RequestDataTypeEnum } from '@/enums/httpEnum' import { isPreview } from '@/utils' @@ -17,60 +17,62 @@ type ChartEditStoreType = typeof useChartEditStore */ export const useChartDataFetch = ( targetComponent: CreateComponentType, - useChartEditStore: ChartEditStoreType, + useChartEditStore: ChartEditStoreType, updateCallback?: (...args: any) => any ) => { const vChartRef = ref(null) let fetchInterval: any = 0 - isPreview() && - watchEffect(() => { - clearInterval(fetchInterval) + const requestInterval = () => { + const chartEditStore = useChartEditStore() + const { requestOriginUrl, requestInterval } = toRefs( + chartEditStore.getRequestGlobalConfig + ) + // 组件类型 + const { chartFrame } = targetComponent.chartConfig + // 请求配置 + 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 + if (!completePath) return - const chartEditStore = useChartEditStore() - const { requestOriginUrl, requestInterval } = toRefs( - chartEditStore.getRequestGlobalConfig - ) - 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 - if (!completePath) return - - fetchInterval = setInterval(async () => { - const res:any = await http(requestHttpType.value)(completePath || '', {}) - if (res.data) { - // 是否是 Echarts 组件 - const isECharts = - targetComponent.chartConfig.package === - PackagesCategoryEnum.CHARTS - - try { - if (isECharts && vChartRef?.value?.setOption) { - nextTick(() => { - if (vChartRef.value) { - vChartRef.value.setOption({ dataset: res.data }) - } - }) - } else { - // 若遵守规范使用 datase 作为数据 key,则省自动赋值数据 - targetComponent.option.dataset && (targetComponent.option.dataset = res.data) + const fetchFn = async () => { + const res: any = await http(requestHttpType.value)(completePath || '', {}) + if (res.data) { + try { + // 更新回调函数 + if (updateCallback) { + updateCallback(res.data) + } else { + // eCharts 组件配合 vChart 库更新方式 + if (chartFrame === ChartFrameEnum.ECHARTS) { + if (vChartRef.value) { + vChartRef.value.setOption({ dataset: res.data }) + } } - if (updateCallback) { - updateCallback(res.data) - } - } catch (error) { - console.error(error) } + } catch (error) { + console.error(error) } - }, requestInterval.value * 1000) + } } - }) + + // 立即调用 + fetchFn() + // 开启定时 + setInterval(fetchFn, requestInterval.value * 1000) + } + } + + isPreview() && requestInterval() + return { vChartRef } } diff --git a/src/packages/components/Charts/Bars/BarCommon/index.ts b/src/packages/components/Charts/Bars/BarCommon/index.ts index 592259f7..a4247970 100644 --- a/src/packages/components/Charts/Bars/BarCommon/index.ts +++ b/src/packages/components/Charts/Bars/BarCommon/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/bar_x.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const BarCommonConfig: ConfigType = { @@ -10,5 +10,6 @@ export const BarCommonConfig: ConfigType = { category: ChatCategoryEnum.BAR, categoryName: ChatCategoryEnumName.BAR, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Bars/BarCrossrange/index.ts b/src/packages/components/Charts/Bars/BarCrossrange/index.ts index 6be2ad01..a85f9fe9 100644 --- a/src/packages/components/Charts/Bars/BarCrossrange/index.ts +++ b/src/packages/components/Charts/Bars/BarCrossrange/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/bar_y.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const BarCrossrangeConfig: ConfigType = { @@ -10,5 +10,6 @@ export const BarCrossrangeConfig: ConfigType = { category: ChatCategoryEnum.BAR, categoryName: ChatCategoryEnumName.BAR, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Lines/LineCommon/index.ts b/src/packages/components/Charts/Lines/LineCommon/index.ts index 337b57e7..1897682e 100644 --- a/src/packages/components/Charts/Lines/LineCommon/index.ts +++ b/src/packages/components/Charts/Lines/LineCommon/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/line.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const LineCommonConfig: ConfigType = { @@ -10,5 +10,6 @@ export const LineCommonConfig: ConfigType = { category: ChatCategoryEnum.LINE, categoryName: ChatCategoryEnumName.LINE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Lines/LineGradientSingle/index.ts b/src/packages/components/Charts/Lines/LineGradientSingle/index.ts index 39e00c43..0e21e0cd 100644 --- a/src/packages/components/Charts/Lines/LineGradientSingle/index.ts +++ b/src/packages/components/Charts/Lines/LineGradientSingle/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/line_gradient_single.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const LineGradientSingleConfig: ConfigType = { @@ -10,5 +10,6 @@ export const LineGradientSingleConfig: ConfigType = { category: ChatCategoryEnum.LINE, categoryName: ChatCategoryEnumName.LINE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Lines/LineGradients/index.ts b/src/packages/components/Charts/Lines/LineGradients/index.ts index 39d6a214..347ac0ce 100644 --- a/src/packages/components/Charts/Lines/LineGradients/index.ts +++ b/src/packages/components/Charts/Lines/LineGradients/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/line_gradient2.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const LineGradientsConfig: ConfigType = { @@ -10,5 +10,6 @@ export const LineGradientsConfig: ConfigType = { category: ChatCategoryEnum.LINE, categoryName: ChatCategoryEnumName.LINE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Mores/Process/config.ts b/src/packages/components/Charts/Mores/Process/config.ts index 34d86502..16b47327 100644 --- a/src/packages/components/Charts/Mores/Process/config.ts +++ b/src/packages/components/Charts/Mores/Process/config.ts @@ -33,15 +33,29 @@ export const indicatorPlacements = [ export const option = { dataset: 36, + // 默认类型 type: types[2].value, + // 进行时效果 + processing: true, + // 主颜色 color: '#4992FFFF', + // 轨道颜色 + railColor: '#3e3e3f', + // 指标 + unit: '%', + // 指标大小 + indicatorTextSize: 34, // 指标位置(线条时可用) - indicatorPlacement: "outside" + indicatorPlacement: 'outside', + // 指标颜色 + indicatorTextColor: '#FFFFFFFF', + // 偏移角度 + offsetDegree: 0 } export default class Config extends publicConfig implements CreateComponentType { public key = ProcessConfig.key - public attr = {...chartInitConfig, h: 500, zIndex: -1} + public attr = { ...chartInitConfig, h: 500, zIndex: -1 } public chartConfig = cloneDeep(ProcessConfig) public option = cloneDeep(option) } \ No newline at end of file diff --git a/src/packages/components/Charts/Mores/Process/config.vue b/src/packages/components/Charts/Mores/Process/config.vue index 74003105..2842d910 100644 --- a/src/packages/components/Charts/Mores/Process/config.vue +++ b/src/packages/components/Charts/Mores/Process/config.vue @@ -1,29 +1,49 @@ @@ -31,14 +51,10 @@ \ No newline at end of file + diff --git a/src/packages/components/Charts/Mores/Process/index.vue b/src/packages/components/Charts/Mores/Process/index.vue index 1bba3c80..60818b1d 100644 --- a/src/packages/components/Charts/Mores/Process/index.vue +++ b/src/packages/components/Charts/Mores/Process/index.vue @@ -1,27 +1,67 @@ \ No newline at end of file +const option = shallowReactive({ + dataset: configOption.dataset +}) + +// 手动更新 +watch( + () => props.chartConfig.option.dataset, + (newData: any) => { + option.dataset = newData + } +) +// 预览更新 +useChartDataFetch(props.chartConfig, useChartEditStore, (newData: number) => { + option.dataset = newData +}) + diff --git a/src/packages/components/Charts/Mores/WaterPolo/index.ts b/src/packages/components/Charts/Mores/WaterPolo/index.ts index 9bd2e2cb..5ada6093 100644 --- a/src/packages/components/Charts/Mores/WaterPolo/index.ts +++ b/src/packages/components/Charts/Mores/WaterPolo/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/water_WaterPolo.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const WaterPoloConfig: ConfigType = { @@ -10,5 +10,6 @@ export const WaterPoloConfig: ConfigType = { category: ChatCategoryEnum.MORE, categoryName: ChatCategoryEnumName.MORE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Mores/WaterPolo/index.vue b/src/packages/components/Charts/Mores/WaterPolo/index.vue index f829f25f..36af753b 100644 --- a/src/packages/components/Charts/Mores/WaterPolo/index.vue +++ b/src/packages/components/Charts/Mores/WaterPolo/index.vue @@ -1,11 +1,5 @@ diff --git a/src/packages/components/Charts/Pies/PieCircle/config.ts b/src/packages/components/Charts/Pies/PieCircle/config.ts index ff6f63b3..074a0cc2 100644 --- a/src/packages/components/Charts/Pies/PieCircle/config.ts +++ b/src/packages/components/Charts/Pies/PieCircle/config.ts @@ -2,7 +2,8 @@ import { echartOptionProfixHandle, publicConfig } from '@/packages/public' import { PieCircleConfig } from './index' import { CreateComponentType } from '@/packages/index.d' -export const includes = ['legend'] +export const includes = [] + const option = { tooltip: { show: true, diff --git a/src/packages/components/Charts/Pies/PieCircle/index.ts b/src/packages/components/Charts/Pies/PieCircle/index.ts index deec7530..78c8bed7 100644 --- a/src/packages/components/Charts/Pies/PieCircle/index.ts +++ b/src/packages/components/Charts/Pies/PieCircle/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/pie-circle.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const PieCircleConfig: ConfigType = { @@ -10,5 +10,6 @@ export const PieCircleConfig: ConfigType = { category: ChatCategoryEnum.PIE, categoryName: ChatCategoryEnumName.PIE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Charts/Pies/PieCircle/index.vue b/src/packages/components/Charts/Pies/PieCircle/index.vue index a4bf95da..4309e02b 100644 --- a/src/packages/components/Charts/Pies/PieCircle/index.vue +++ b/src/packages/components/Charts/Pies/PieCircle/index.vue @@ -1,9 +1,9 @@ diff --git a/src/packages/components/Charts/Pies/PieCommon/index.ts b/src/packages/components/Charts/Pies/PieCommon/index.ts index 9efaee72..d8394c08 100644 --- a/src/packages/components/Charts/Pies/PieCommon/index.ts +++ b/src/packages/components/Charts/Pies/PieCommon/index.ts @@ -1,5 +1,5 @@ import image from '@/assets/images/chart/charts/pie.png' -import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const PieCommonConfig: ConfigType = { @@ -10,5 +10,6 @@ export const PieCommonConfig: ConfigType = { category: ChatCategoryEnum.PIE, categoryName: ChatCategoryEnumName.PIE, package: PackagesCategoryEnum.CHARTS, + chartFrame: ChartFrameEnum.ECHARTS, image } diff --git a/src/packages/components/Decorates/Mores/Number/config.ts b/src/packages/components/Decorates/Mores/Number/config.ts index c3a8b940..7a7679d4 100644 --- a/src/packages/components/Decorates/Mores/Number/config.ts +++ b/src/packages/components/Decorates/Mores/Number/config.ts @@ -4,12 +4,13 @@ import { NumberConfig } from './index' import cloneDeep from 'lodash/cloneDeep' export const option = { - from: 50000, - to: 100000, + // 数据说明 + dataset: 100000, + from: 0, dur: 3, precision: 0, showSeparator: true, - numberSize: 24, + numberSize: 34, numberColor: '#4a9ef8', prefixText: '¥', prefixColor: '#4a9ef8', diff --git a/src/packages/components/Decorates/Mores/Number/config.vue b/src/packages/components/Decorates/Mores/Number/config.vue index c951ed5e..e7b2cadb 100644 --- a/src/packages/components/Decorates/Mores/Number/config.vue +++ b/src/packages/components/Decorates/Mores/Number/config.vue @@ -1,13 +1,6 @@ - diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue index 9792e796..3ea2a228 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/index.vue +++ b/src/packages/components/Tables/Tables/TableScrollBoard/index.vue @@ -308,7 +308,10 @@ watch( ) // 数据更新 (默认更新 dataset,若更新之后有其它操作,可添加回调函数) -useChartDataFetch(props.chartConfig, useChartEditStore) +useChartDataFetch(props.chartConfig, useChartEditStore, (resData: any[]) => { + props.chartConfig.option.dataset = resData + onRestart() +}) onUnmounted(() => { stopAnimation() diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts index 1c5c2ef7..02c50e9b 100644 --- a/src/packages/index.d.ts +++ b/src/packages/index.d.ts @@ -1,6 +1,12 @@ import type { GlobalThemeJsonType } from '@/settings/chartThemes/index' import type { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' +export enum ChartFrameEnum { + COMMON = 'common', + ECHARTS = 'echarts', + NAIVE_UI = 'naiveUI' +} + // 组件配置 export type ConfigType = { key: string @@ -10,6 +16,7 @@ export type ConfigType = { category: string categoryName: string package: string + chartFrame?: ChartFrameEnum image: string | (() => Promise) } @@ -80,7 +87,7 @@ export interface CreateComponentType extends PublicConfigType { } // 获取组件实例类中某个key对应value类型的方法 -export type PickCreateComponentType = Pick[T] +export type PickCreateComponentType = Pick[T] // 包分类枚举 export enum PackagesCategoryEnum { diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index 653fc467..f26c0461 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -45,7 +45,7 @@ export enum EditCanvasConfigEnum { CHART_THEME_COLOR = 'chartThemeColor', CHART_THEME_SETTING = 'chartThemeSetting', BACKGROUND = 'background', - BACKGROUND_IAMGE = 'backgroundImage', + BACKGROUND_IMAGE = 'backgroundImage', SELECT_COLOR = 'selectColor', PREVIEW_SCALE_TYPE = 'previewScaleType', } @@ -73,7 +73,7 @@ export interface EditCanvasConfigType { [EditCanvasConfigEnum.HEIGHT]: number // 背景色 [EditCanvasConfigEnum.BACKGROUND]?: string - [EditCanvasConfigEnum.BACKGROUND_IAMGE]?: string | null + [EditCanvasConfigEnum.BACKGROUND_IMAGE]?: string | null // 图表主题颜色 [EditCanvasConfigEnum.CHART_THEME_COLOR]: ChartColorsNameType // 图表全局配置 @@ -107,7 +107,7 @@ export type MousePositionType = { // 操作目标 export type TargetChartType = { hoverId?: string - selectId?: string + selectId: string[] } // 数据记录 diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 843c942e..a0b63abe 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -1,5 +1,4 @@ import { defineStore } from 'pinia' -import { getUUID, loadingStart, loadingFinish, loadingError } from '@/utils' import { CreateComponentType } from '@/packages/index.d' import debounce from 'lodash/debounce' import cloneDeep from 'lodash/cloneDeep' @@ -11,7 +10,14 @@ import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHis import { useSettingStore } from '@/store/modules/settingStore/settingStore' import { HistoryActionTypeEnum, HistoryItemType, HistoryTargetTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' import { MenuEnum } from '@/enums/editPageEnum' -import { PreviewScaleEnum } from '@/enums/styleEnum' +import { + getUUID, + loadingStart, + loadingFinish, + loadingError, + isString, + isArray +} from '@/utils' import { ChartEditStoreEnum, ChartEditStorage, @@ -61,7 +67,7 @@ export const useChartEditStore = defineStore({ // 目标图表 targetChart: { hoverId: undefined, - selectId: undefined + selectId: [] }, // 记录临时数据(复制等) recordChart: undefined, @@ -160,8 +166,36 @@ export const useChartEditStore = defineStore({ this.targetChart.hoverId = hoverId }, // * 设置目标数据 select - setTargetSelectChart(selectId?:TargetChartType["selectId"]) { - this.targetChart.selectId = selectId + setTargetSelectChart(selectId?: string | string[], push: boolean = false) { + // 无 id 清空 + if(!selectId) { + this.targetChart.selectId = [] + return + } + // 新增 + if(push) { + // 字符串 + if(isString(selectId)) { + this.targetChart.selectId.push(selectId) + return + } + // 数组 + if(isArray(selectId)) { + this.targetChart.selectId.push(...selectId) + return + } + } else { + // 字符串 + if(isString(selectId)) { + this.targetChart.selectId = [selectId] + return + } + // 数组 + if(isArray(selectId)) { + this.targetChart.selectId = selectId + return + } + } }, // * 设置记录数据 setRecordChart(item: RecordChartType | undefined) { @@ -176,7 +210,7 @@ export const useChartEditStore = defineStore({ }, // * 找到目标 id 数据下标位置(无则返回-1) fetchTargetIndex(id?: string): number { - const targetId = id || this.getTargetChart.selectId + const targetId = id || this.getTargetChart.selectId.length && this.getTargetChart.selectId[0] || undefined if(!targetId) { loadingFinish() return -1 @@ -367,7 +401,6 @@ export const useChartEditStore = defineStore({ e = cloneDeep(e) // 生成新 id e.id = getUUID() - // 偏移位置 e.attr.x = this.getMousePosition.x + 30 e.attr.y = this.getMousePosition.y + 30 return e diff --git a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue index db53971d..a3d32866 100644 --- a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue +++ b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue @@ -236,7 +236,7 @@ const beforeUploadHandle = async ({ file }) => { // 清除背景 const clearImage = () => { chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.BACKGROUND_IAMGE, + EditCanvasConfigEnum.BACKGROUND_IMAGE, undefined ) chartEditStore.setEditCanvasConfig( @@ -274,7 +274,7 @@ const customRequest = (options: UploadCustomRequestOptions) => { if (file.file) { const ImageUrl = fileToUrl(file.file) chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.BACKGROUND_IAMGE, + EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl ) chartEditStore.setEditCanvasConfig( 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 bd795936..3098f6f1 100644 --- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataAjax/index.vue @@ -62,7 +62,7 @@ import { ref, toRefs } from 'vue' import { icon } from '@/plugins' import { SettingItemBox } from '@/components/Pages/ChartItemSetting' import { RequestHttpEnum, ResultEnum } from '@/enums/httpEnum' -import { chartDataUrl, rankListUrl, numberUrl } from '@/api/mock' +import { chartDataUrl, rankListUrl, scrollBoardUrl, numberFloatUrl, numberIntUrl, textUrl, imageUrl } from '@/api/mock' import { http } from '@/api/http' import { SelectHttpType } from '../../index.d' import { ChartDataMatchingAndShow } from '../ChartDataMatchingAndShow' @@ -82,11 +82,24 @@ const apiList = [ value: `【图表】${ chartDataUrl }` }, { - value: `【表格】${ rankListUrl }` + value: `【文本】${ textUrl }` }, { - value: `【0~1数字】${ numberUrl }` - } + value: `【0~100 整数】${ numberIntUrl }` + }, + { + value: `【0~1小数】${ numberFloatUrl }` + }, + { + value: `【图片地址】${ imageUrl }` + }, + { + value: `【排名列表】${ rankListUrl }` + }, + { + value: `【滚动表格】${ scrollBoardUrl }` + }, + ] // 选项 diff --git a/src/views/chart/ContentConfigurations/components/ChartData/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/index.vue index 0c4f46d7..c8c07a8e 100644 --- a/src/views/chart/ContentConfigurations/components/ChartData/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartData/index.vue @@ -40,10 +40,4 @@ const selectOptions: SelectCreateDataType[] = [ value: RequestDataTypeEnum.AJAX } ] - - - - + \ No newline at end of file diff --git a/src/views/chart/ContentConfigurations/index.vue b/src/views/chart/ContentConfigurations/index.vue index 9117594a..92ba612d 100644 --- a/src/views/chart/ContentConfigurations/index.vue +++ b/src/views/chart/ContentConfigurations/index.vue @@ -123,7 +123,8 @@ const expandHindle = () => { const selectTarget = computed(() => { const selectId = chartEditStore.getTargetChart.selectId - if (!selectId) return undefined + // 排除多个 + if (selectId.length !== 1) return undefined return chartEditStore.componentList[chartEditStore.fetchTargetIndex()] }) diff --git a/src/views/chart/ContentEdit/components/EditAlignLine/index.vue b/src/views/chart/ContentEdit/components/EditAlignLine/index.vue index 233c33db..dea92fe1 100644 --- a/src/views/chart/ContentEdit/components/EditAlignLine/index.vue +++ b/src/views/chart/ContentEdit/components/EditAlignLine/index.vue @@ -4,12 +4,9 @@ class="line" v-for="item in line.lineArr" :key="item" - :class="[ - item.includes('row') ? 'row' : 'col', - line['select'].has(item) && 'visible' - ]" + :class="[item.includes('row') ? 'row' : 'col', line['select'].has(item) && 'visible']" :style="useComponentStyle(line['select'].get(item))" - > + > @@ -21,7 +18,7 @@ import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStor import { useSettingStore } from '@/store/modules/settingStore/settingStore' import { CreateComponentType } from '@/packages/index.d' import throttle from 'lodash/throttle' -import cloneDeep from 'lodash/cloneDeep' +import cloneDeep from 'lodash/cloneDeep' // 全局颜色 const designStore = useDesignStore() const themeColor = ref(designStore.getAppTheme) @@ -53,7 +50,7 @@ const useComponentStyle = (attr?: Partial<{ x: number; y: number }>) => { } // * 吸附距离 -const minDistance = computed(()=>{ +const minDistance = computed(() => { return settingStore.getChartAlignRange }) @@ -72,9 +69,7 @@ const isSorption = (selectValue: number, componentValue: number) => { // * 当前目标 const selectId = computed(() => chartEditStore.getTargetChart.selectId) -const selectTarget = computed( - () => chartEditStore.getComponentList[chartEditStore.fetchTargetIndex()] -) +const selectTarget = computed(() => chartEditStore.getComponentList[chartEditStore.fetchTargetIndex()]) const selectAttr = computed(() => selectTarget.value?.attr || {}) // * 画布坐标 @@ -95,7 +90,7 @@ const canvasPositionList = computed(() => { watch( () => chartEditStore.getMousePosition, throttle(() => { - if (!isComputedLine.value) return + if (!isComputedLine.value || selectId.value.length !== 1) return // 获取目标组件数据 const selectW = selectAttr.value.w @@ -111,12 +106,12 @@ watch( const selectTopY = selectAttr.value.y const selectHalfY = selectTopY + selectH / 2 const selectBottomY = selectTopY + selectH - const seletY = [selectTopY, selectHalfY, selectBottomY] + const selectY = [selectTopY, selectHalfY, selectBottomY] line.select.clear() line.sorptioned.y = false // 循环查询所有组件数据 - const componentList = chartEditStore.getComponentList.map((e:CreateComponentType) => { + const componentList = chartEditStore.getComponentList.map((e: CreateComponentType) => { return { id: e.id, attr: e.attr @@ -127,7 +122,7 @@ watch( line.lineArr.forEach(lineItem => { componentList.forEach((component: typeof canvasPositionList.value) => { // 排除自身 - if (selectId.value === component.id) return + if (selectId.value[0] === component.id) return const componentW = component.attr.w const componentH = component.attr.h @@ -163,24 +158,15 @@ watch( // 顶部 if (isSorption(selectHalfY, componentTopY)) { line.select.set(lineItem, { y: componentTopY }) - selectTarget.value.setPosition( - selectLeftX, - componentTopY - selectH / 2 - ) + selectTarget.value.setPosition(selectLeftX, componentTopY - selectH / 2) } if (isSorption(selectHalfY, componentHalfY)) { line.select.set(lineItem, { y: componentHalfY }) - selectTarget.value.setPosition( - selectLeftX, - componentHalfY - selectH / 2 - ) + selectTarget.value.setPosition(selectLeftX, componentHalfY - selectH / 2) } if (isSorption(selectHalfY, componentBottomY)) { line.select.set(lineItem, { y: componentBottomY }) - selectTarget.value.setPosition( - selectLeftX, - componentBottomY - selectH / 2 - ) + selectTarget.value.setPosition(selectLeftX, componentBottomY - selectH / 2) } } if (lineItem.includes('rowb')) { @@ -191,17 +177,11 @@ watch( } if (isSorption(selectBottomY, componentHalfY)) { line.select.set(lineItem, { y: componentHalfY }) - selectTarget.value.setPosition( - selectLeftX, - componentHalfY - selectH - ) + selectTarget.value.setPosition(selectLeftX, componentHalfY - selectH) } if (isSorption(selectBottomY, componentBottomY)) { line.select.set(lineItem, { y: componentBottomY }) - selectTarget.value.setPosition( - selectLeftX, - componentBottomY - selectH - ) + selectTarget.value.setPosition(selectLeftX, componentBottomY - selectH) } } @@ -223,24 +203,15 @@ watch( if (lineItem.includes('colc')) { if (isSorption(selectHalfX, componentLeftX)) { line.select.set(lineItem, { x: componentLeftX }) - selectTarget.value.setPosition( - componentLeftX - selectW / 2, - selectTopY - ) + selectTarget.value.setPosition(componentLeftX - selectW / 2, selectTopY) } if (isSorption(selectHalfX, componentHalfX)) { line.select.set(lineItem, { x: componentHalfX }) - selectTarget.value.setPosition( - componentHalfX - selectW / 2, - selectTopY - ) + selectTarget.value.setPosition(componentHalfX - selectW / 2, selectTopY) } if (isSorption(selectHalfX, componentRightX)) { line.select.set(lineItem, { x: componentRightX }) - selectTarget.value.setPosition( - componentRightX - selectW / 2, - selectTopY - ) + selectTarget.value.setPosition(componentRightX - selectW / 2, selectTopY) } } if (lineItem.includes('colr')) { @@ -254,14 +225,14 @@ watch( } if (isSorption(selectRightX, componentRightX)) { line.select.set(lineItem, { x: componentRightX }) - selectTarget.value.setPosition( componentRightX - selectW, selectTopY ) + selectTarget.value.setPosition(componentRightX - selectW, selectTopY) } } /* * 我也不知道为什么这个不行,还没时间调 if(lineItem.includes('row')) { - seletY.forEach(sY => { + selectY.forEach(sY => { componentY.forEach(cY => { if (isSorption(sY, cY)) { line.select.set(lineItem, { y: cY }) diff --git a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue index 9198aef3..59899b73 100644 --- a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue +++ b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue @@ -4,19 +4,16 @@
+ >
-
+
@@ -52,8 +49,10 @@ const hover = computed(() => { return props.item.id === chartEditStore.getTargetChart.hoverId }) +// 兼容多值场景 const select = computed(() => { - return props.item.id === chartEditStore.getTargetChart.selectId + const id = props.item.id + return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) }) @@ -79,7 +78,7 @@ const select = computed(() => { width: 30px; transform: translate(-50%, -30%); } - &.l, + &.l, &.r { height: 30px; } @@ -89,9 +88,8 @@ const select = computed(() => { &.l { transform: translate(-45%, -50%); } - &.rt, - &.rb - { + &.rt, + &.rb { transform: translate(-30%, -30%); } } diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index 3444807e..97c09028 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -43,7 +43,8 @@ const { image } = toRefs(props.componentData.chartConfig) // 计算当前选中目标 const select = computed(() => { - return props.componentData.id === chartEditStore.getTargetChart.selectId + const id = props.componentData.id + return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) }) const hover = computed(() => { diff --git a/src/views/chart/hooks/useKeyboard.hook.ts b/src/views/chart/hooks/useKeyboard.hook.ts index 0d7d4ad2..58ab28c4 100644 --- a/src/views/chart/hooks/useKeyboard.hook.ts +++ b/src/views/chart/hooks/useKeyboard.hook.ts @@ -75,9 +75,21 @@ const macKeyList: Array = [ macKeyboardValue.forward, ] +// 处理键盘记录 +const keyRecordHandle = () => { + document.onkeydown = throttle((e: KeyboardEvent) => { + if(window.$KeyboardActive) window.$KeyboardActive.add(e.key.toLocaleLowerCase()) + else window.$KeyboardActive = new Set([e.key]) + }, 200) + + document.onkeyup = throttle((e: KeyboardEvent) => { + if(window.$KeyboardActive) window.$KeyboardActive.delete(e.key.toLocaleLowerCase()) + }, 200) +} + // 初始化监听事件 export const useAddKeyboard = () => { - const switchHande = (keyboardValue: typeof winKeyboardValue, e: string) => { + const switchHandle = (keyboardValue: typeof winKeyboardValue, e: string) => { switch (e) { // ct+↑ case keyboardValue.up: @@ -124,15 +136,20 @@ export const useAddKeyboard = () => { } } winKeyList.forEach((key: string) => { - switchHande(winKeyboardValue, key) + switchHandle(winKeyboardValue, key) }) macKeyList.forEach((key: string) => { - switchHande(macKeyboardValue, key) + switchHandle(macKeyboardValue, key) }) + + keyRecordHandle() } // 卸载监听事件 export const useRemoveKeyboard = () => { + document.onkeydown = () => {}; + document.onkeyup = () => {}; + winKeyList.forEach((key: string) => { keymaster.unbind(key) }) diff --git a/types/global.d.ts b/types/global.d.ts index 74863473..3636172e 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -5,6 +5,8 @@ interface Window { // 语言 $t: any $vue: any + // 键盘按键记录 + $KeyboardActive?: Set } declare type Recordable = Record \ No newline at end of file