From 04539d605dc9b92773f658c3b35901c0c817e61e Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Tue, 27 Sep 2022 20:14:00 +0800 Subject: [PATCH 01/56] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E6=A8=A1=E5=BC=8F=E6=8E=A7=E5=88=B6=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 1 + src/plugins/icon.ts | 13 ++++++-- src/styles/common/style.scss | 23 +++++++++----- src/views/chart/ContentBox/index.vue | 15 +++------ src/views/chart/ContentLayers/index.vue | 41 ++++++++++++++++++++++--- 5 files changed, 67 insertions(+), 26 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d01f44ae..25f7f0d1 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -22,6 +22,7 @@ module.exports = { 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-unused-vars': 'off', + 'vue/no-unused-vars': 'off', 'vue/multi-word-component-names': 'off', 'vue/valid-template-root': 'off', 'vue/no-mutating-props': 'off' diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index 90bf057c..bcc2496a 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -57,7 +57,10 @@ import { ChevronDownOutline as ChevronDownOutlineIcon, Pulse as PulseIcon, Folder as FolderIcon, - FolderOpen as FolderOpenIcon + FolderOpen as FolderOpenIcon, + Image as ImageIcon, + Images as ImagesIcon, + List as ListIcon } from '@vicons/ionicons5' import { @@ -211,7 +214,13 @@ const ionicons5 = { // 文件夹 FolderIcon, // 文件夹打开 - FolderOpenIcon + FolderOpenIcon, + // 图片 + ImageIcon, + // 多个图片 + ImagesIcon, + // 列表 + ListIcon } const carbon = { diff --git a/src/styles/common/style.scss b/src/styles/common/style.scss index 9fde7bf4..13dee27b 100644 --- a/src/styles/common/style.scss +++ b/src/styles/common/style.scss @@ -1,7 +1,7 @@ -@import './var.scss'; -@import './format.scss'; -@import './animation.scss'; -@import './mixins/mixins.scss'; +@import "./var.scss"; +@import "./format.scss"; +@import "./animation.scss"; +@import "./mixins/mixins.scss"; // 过度 .go-transition { @@ -49,14 +49,14 @@ // 毛玻璃 .go-background-filter { backdrop-filter: $--filter-blur-base; - @include fetch-bg-color('filter-color'); + @include fetch-bg-color("filter-color"); box-shadow: $--border-shadow; } // 毛玻璃 .go-background-filter-shallow { backdrop-filter: $--filter-blur-base; - @include fetch-bg-color('filter-color-shallow'); + @include fetch-bg-color("filter-color-shallow"); box-shadow: $--border-shadow; } @@ -68,7 +68,7 @@ // 背景斑点需配合 @mixin background-image 使用 .go-point-bg { - @include fetch-theme-custom('background-color', 'background-color1'); + @include fetch-theme-custom("background-color", "background-color1"); background-size: 15px 15px, 15px 15px; } @@ -117,4 +117,11 @@ .go-#{$typekey} { #{$type}: 0 !important; } -} \ No newline at end of file +} + +.go-d-inline-block { + display: inline-block; +} +.go-d-block { + display: block; +} diff --git a/src/views/chart/ContentBox/index.vue b/src/views/chart/ContentBox/index.vue index 8c10edcf..826bbb85 100644 --- a/src/views/chart/ContentBox/index.vue +++ b/src/views/chart/ContentBox/index.vue @@ -10,14 +10,9 @@ <slot name="icon"></slot> </div> </n-space> - <n-space> + <n-space align="center" style="gap: 4px"> <slot name="top-right"></slot> - <n-icon - v-show="backIcon" - size="20" - class="go-cursor-pointer" - @click="backHandle" - > + <n-icon v-show="backIcon" size="20" class="go-cursor-pointer go-d-block" @click="backHandle"> <chevron-back-outline-icon></chevron-back-outline-icon> </n-icon> </n-space> @@ -151,7 +146,7 @@ $topOrBottomHeight: 40px; border-bottom: 1px solid; @include fetch-border-color('background-color1'); } - + .content { height: calc(100vh - #{$--header-height}); overflow: hidden; @@ -165,9 +160,7 @@ $topOrBottomHeight: 40px; height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight}); } .content-height-show-both { - height: calc( - 100vh - #{$--header-height} - #{$topOrBottomHeight} - #{$topOrBottomHeight} - ); + height: calc(100vh - #{$--header-height} - #{$topOrBottomHeight} - #{$topOrBottomHeight}); } } </style> diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index 1c34c7b3..1211316f 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -8,14 +8,41 @@ @mousedown="boxMousedownHandle($event)" > <template #icon> - <n-icon size="16" :depth="2"> - <component :is="LayersIcon"></component> - </n-icon> + <n-icon size="16" :depth="2" :component="LayersIcon" /> </template> + + <template #top-right> + <n-radio-group v-model:value="layerMode" name="radiobuttongroup1" size="small" class="go-flex-center"> + <n-radio-button value="thumbnail"> + <n-icon size="16" class="go-d-block" title="缩略图" :depth="2" :component="ImageIcon" /> + </n-radio-button> + <n-radio-button value="text"> + <n-icon size="16" class="go-d-block" title="文字列表" :depth="2" :component="ListIcon" /> + </n-radio-button> + </n-radio-group> + <!-- <n-icon + size="16" + class="go-cursor-pointer go-d-block" + title="缩略图" + :depth="2" + :component="ImageIcon" + :class="{ 'go-layer-mode-active': layerMode === 'thumbnail' }" + /> + <n-icon + size="16" + class="go-cursor-pointer go-d-block" + title="文字列表" + :depth="2" + :component="ListIcon" + :class="{ 'go-layer-mode-active': layerMode === 'text' }" + /> --> + </template> + <!-- 图层内容 --> <n-space v-if="reverseList.length === 0" justify="center"> <n-text class="not-layer-text">暂无图层~</n-text> </n-space> + <!-- https://github.com/SortableJS/vue.draggable.next --> <draggable item-key="id" v-model="layerList" ghostClass="ghost" @change="onMoveCallback"> <template #item="{ element }"> @@ -55,12 +82,13 @@ import { LayersGroupListItem } from './components/LayersGroupListItem/index' import { icon } from '@/plugins' -const { LayersIcon } = icon.ionicons5 +const { LayersIcon, ImageIcon, ListIcon } = icon.ionicons5 const chartLayoutStore = useChartLayoutStore() const chartEditStore = useChartEditStore() const { handleContextMenu, onClickOutSide } = useContextMenu() const layerList = ref<any>([]) +const layerMode = ref<'thumbnail' | 'text'>('thumbnail') // 逆序展示 const reverseList = computed(() => { @@ -159,7 +187,7 @@ const mouseleaveHandle = (item: CreateComponentType) => { </script> <style lang="scss" scoped> -$wight: 170px; +$wight: 180px; @include go(content-layers) { width: $wight; flex-shrink: 0; @@ -177,5 +205,8 @@ $wight: 170px; .ghost { opacity: 0; } + .go-layer-mode-active { + color: #51d6a9; + } } </style> From e559ca928ad540ccf80c274c6cdd18bd79eede1c Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 11:21:29 +0800 Subject: [PATCH 02/56] =?UTF-8?q?chore:=20=E5=AE=8C=E6=88=90=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E5=8F=8A=E9=9A=90=E8=97=8F=EF=BC=8C=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=8A=9F=E8=83=BD=E5=8D=A0=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/icon.ts | 9 ++- .../components/LayersGroupListItem/index.vue | 44 ++++++++++++-- .../components/LayersListItem/index.vue | 53 +++++++++++++---- src/views/chart/ContentLayers/enums.ts | 1 + src/views/chart/ContentLayers/index.vue | 59 ++++++++++--------- 5 files changed, 119 insertions(+), 47 deletions(-) create mode 100644 src/views/chart/ContentLayers/enums.ts diff --git a/src/plugins/icon.ts b/src/plugins/icon.ts index bcc2496a..48d6a0a0 100644 --- a/src/plugins/icon.ts +++ b/src/plugins/icon.ts @@ -60,7 +60,9 @@ import { FolderOpen as FolderOpenIcon, Image as ImageIcon, Images as ImagesIcon, - List as ListIcon + List as ListIcon, + EyeOutline as EyeOutlineIcon, + EyeOffOutline as EyeOffOutlineIcon } from '@vicons/ionicons5' import { @@ -220,7 +222,10 @@ const ionicons5 = { // 多个图片 ImagesIcon, // 列表 - ListIcon + ListIcon, + // 眼睛 + EyeOutlineIcon, + EyeOffOutlineIcon } const carbon = { diff --git a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue index 9c4fb019..ae6d0418 100644 --- a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -2,7 +2,7 @@ <div class="go-content-layers-group-list-item"> <div class="root-item-content" - :class="{ hover: hover, select: select }" + :class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }" @click="clickHandle($event)" @mousedown="groupMousedownHandle($event)" @mouseenter="mouseenterHandle(componentGroupData)" @@ -18,11 +18,13 @@ <folder-icon></folder-icon> </template> </n-icon> - <n-ellipsis> + <n-ellipsis style="margin-right: auto"> <n-text class="go-ml-2 list-text" :depth="2"> {{ componentGroupData.chartConfig.title }} </n-text> </n-ellipsis> + <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" /> + <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" /> </div> <div :class="{ 'select-modal': select }"></div> </div> @@ -31,6 +33,7 @@ v-for="element in componentGroupData.groupList" :key="element.id" :componentData="element" + :layer-mode="layerMode" @mousedown="mousedownHandle($event, element, componentGroupData.id)" @mouseenter="mouseenterHandle(element)" @mouseleave="mouseleaveHandle(element)" @@ -50,13 +53,21 @@ import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { LayersListItem } from '../LayersListItem' -import throttle from 'lodash/throttle' import { icon } from '@/plugins' +import { LayerModeEnum } from '../../enums' + +const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 const props = defineProps({ componentGroupData: { type: Object as PropType<CreateComponentGroupType>, required: true + }, + layerMode: { + type: Object as PropType<LayerModeEnum>, + default(): LayerModeEnum { + return 'thumbnail' + } } }) @@ -148,7 +159,11 @@ const groupMousedownHandle = (e: MouseEvent) => { } // 公共点击事件 -const mousedownHandle = (e: MouseEvent, componentInstance: CreateComponentType | CreateComponentGroupType, id?: string) => { +const mousedownHandle = ( + e: MouseEvent, + componentInstance: CreateComponentType | CreateComponentGroupType, + id?: string +) => { e.preventDefault() e.stopPropagation() @@ -169,6 +184,7 @@ const mouseleaveHandle = (componentInstance: CreateComponentType | CreateCompone <style lang="scss" scoped> $centerHeight: 52px; +$centerMiniHeight: 28px; $textSize: 10px; @include go(content-layers-group-list-item) { @@ -178,6 +194,11 @@ $textSize: 10px; margin-bottom: 5px; @extend .go-transition-quick; + :deep(.go-content-layers-list-item) { + margin-right: 0 !important; + width: 95% !important; + } + .root-item-content { height: $centerHeight; cursor: pointer; @@ -196,6 +217,17 @@ $textSize: 10px; border: 1px solid v-bind('themeColor') !important; } } + + // mini样式 + &.list-mini { + height: $centerMiniHeight; + .item-content { + height: calc(#{$centerMiniHeight} - 10px) !important; + } + .select-modal { + height: calc(#{$centerMiniHeight} + 2px) !important; + } + } } .select-modal, .item-content { @@ -220,5 +252,9 @@ $textSize: 10px; padding-left: 6px; font-size: $textSize; } + + .list-status-icon { + margin-left: 3px; + } } </style> diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index 5ef4cdb2..e113e9bc 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -1,5 +1,5 @@ <template> - <div class="go-content-layers-list-item" :class="{ hover: hover, select: select }"> + <div class="go-content-layers-list-item" :class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }"> <div class="go-flex-center item-content"> <n-image class="list-img" @@ -8,21 +8,27 @@ :src="image" :fallback-src="requireErrorImg()" ></n-image> - <n-ellipsis> + <n-ellipsis style="margin-right: auto"> <n-text class="list-text" :depth="2"> {{ props.componentData.chartConfig.title }} </n-text> </n-ellipsis> + <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" /> + <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" /> </div> <div :class="{ 'select-modal': select }"></div> </div> </template> <script setup lang="ts"> -import { toRefs, computed } from 'vue' +import { toRefs, computed, PropType } from 'vue' import { requireErrorImg } from '@/utils' import { useDesignStore } from '@/store/modules/designStore/designStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { LayerModeEnum } from '../../enums' + +import { icon } from '@/plugins' +const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 // 全局颜色 const designStore = useDesignStore() @@ -37,6 +43,12 @@ const props = defineProps({ componentData: { type: Object, required: true + }, + layerMode: { + type: Object as PropType<LayerModeEnum>, + default(): LayerModeEnum { + return 'thumbnail' + } } }) @@ -56,6 +68,7 @@ const hover = computed(() => { <style lang="scss" scoped> $centerHeight: 52px; +$centerMiniHeight: 28px; $textSize: 10px; @include go(content-layers-list-item) { @@ -72,15 +85,7 @@ $textSize: 10px; &:hover { @include fetch-bg-color('background-color4'); } - /* 选中 */ - &.select { - border: 1px solid v-bind('themeColor'); - /* 需要设置最高级,覆盖 hover 的颜色 */ - background-color: rgba(0, 0, 0, 0); - .list-img { - border: 1px solid v-bind('themeColor') !important; - } - } + .select-modal, .item-content { position: absolute; @@ -94,24 +99,46 @@ $textSize: 10px; width: calc(100% - 10px); height: calc(100% - 10px); } + .select-modal { width: 100%; height: 100%; opacity: 0.3; background-color: v-bind('themeColor'); } + .list-img { flex-shrink: 0; height: $centerHeight; border-radius: 5px; overflow: hidden; - border: 1px solid; + border: none !important; padding: 2px; @include hover-border-color('hover-border-color'); } + .list-text { padding-left: 6px; font-size: $textSize; } + + .list-status-icon { + margin-left: 3px; + } + + /* 选中样式 */ + &.select { + border: 1px solid v-bind('themeColor'); + /* 需要设置最高级,覆盖 hover 的颜色 */ + background-color: rgba(0, 0, 0, 0); + // .list-img { + // border: 1px solid v-bind('themeColor') !important; + // } + } + + // mini样式 + &.list-mini { + height: $centerMiniHeight; + } } </style> diff --git a/src/views/chart/ContentLayers/enums.ts b/src/views/chart/ContentLayers/enums.ts new file mode 100644 index 00000000..0cb26ab2 --- /dev/null +++ b/src/views/chart/ContentLayers/enums.ts @@ -0,0 +1 @@ +export type LayerModeEnum = 'thumbnail' | 'text' diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index 1211316f..6e32111b 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -12,30 +12,23 @@ </template> <template #top-right> - <n-radio-group v-model:value="layerMode" name="radiobuttongroup1" size="small" class="go-flex-center"> - <n-radio-button value="thumbnail"> - <n-icon size="16" class="go-d-block" title="缩略图" :depth="2" :component="ImageIcon" /> - </n-radio-button> - <n-radio-button value="text"> - <n-icon size="16" class="go-d-block" title="文字列表" :depth="2" :component="ListIcon" /> - </n-radio-button> - </n-radio-group> - <!-- <n-icon - size="16" - class="go-cursor-pointer go-d-block" - title="缩略图" - :depth="2" - :component="ImageIcon" - :class="{ 'go-layer-mode-active': layerMode === 'thumbnail' }" - /> - <n-icon - size="16" - class="go-cursor-pointer go-d-block" - title="文字列表" - :depth="2" - :component="ListIcon" - :class="{ 'go-layer-mode-active': layerMode === 'text' }" - /> --> + <n-button-group style="display: flex"> + <n-button + v-for="(item, index) in layerModeEnumList" + :key="index" + ghost + size="tiny" + :type="layerMode === item.value ? 'primary' : 'tertiary'" + @click="layerMode = item.value as LayerModeEnum" + > + <n-tooltip :show-arrow="false" trigger="hover"> + <template #trigger> + <n-icon size="14" :component="item.icon" /> + </template> + {{ item.label }} + </n-tooltip> + </n-button> + </n-button-group> </template> <!-- 图层内容 --> @@ -48,11 +41,16 @@ <template #item="{ element }"> <div class="go-content-layer-box"> <!-- 组合 --> - <layers-group-list-item v-if="element.isGroup" :componentGroupData="element"></layers-group-list-item> + <layers-group-list-item + v-if="element.isGroup" + :componentGroupData="element" + :layer-mode="layerMode" + ></layers-group-list-item> <!-- 单组件 --> <layers-list-item v-else :componentData="element" + :layer-mode="layerMode" @mousedown="mousedownHandle($event, element)" @mouseenter="mouseenterHandle(element)" @mouseleave="mouseleaveHandle(element)" @@ -79,16 +77,21 @@ import { MenuEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/ed import { LayersListItem } from './components/LayersListItem/index' import { LayersGroupListItem } from './components/LayersGroupListItem/index' +import { LayerModeEnum } from './enums' import { icon } from '@/plugins' -const { LayersIcon, ImageIcon, ListIcon } = icon.ionicons5 +const { LayersIcon, ImageIcon, ImagesIcon, ListIcon } = icon.ionicons5 const chartLayoutStore = useChartLayoutStore() const chartEditStore = useChartEditStore() const { handleContextMenu, onClickOutSide } = useContextMenu() const layerList = ref<any>([]) -const layerMode = ref<'thumbnail' | 'text'>('thumbnail') +const layerModeEnumList = [ + { label: '缩略图', icon: ImagesIcon, value: 'thumbnail' }, + { label: '文本列表', icon: ListIcon, value: 'text' } +] +const layerMode = ref<LayerModeEnum>('thumbnail') // 逆序展示 const reverseList = computed(() => { @@ -187,7 +190,7 @@ const mouseleaveHandle = (item: CreateComponentType) => { </script> <style lang="scss" scoped> -$wight: 180px; +$wight: 200px; @include go(content-layers) { width: $wight; flex-shrink: 0; From 634b5c2beaba6ae32efe3c4d0d9b205f0a921eda Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 16:47:12 +0800 Subject: [PATCH 03/56] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=8F=9C=E5=8D=95=E5=8A=9F=E8=83=BD=E5=8F=8A=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/enums/editPageEnum.ts | 24 ++++--- .../modules/chartEditStore/chartEditStore.ts | 67 ++++++++++++++++++- .../chartHistoryStore/chartHistoryStore.d.ts | 11 ++- .../chartHistoryStore/chartHistoryStore.ts | 4 ++ .../components/EditGroup/index.vue | 34 ++++++---- src/views/chart/ContentEdit/index.vue | 28 ++++---- .../components/LayersGroupListItem/index.vue | 33 ++++++--- .../components/LayersListItem/index.vue | 8 ++- src/views/chart/ContentLayers/index.vue | 22 +++--- src/views/chart/hooks/useContextMenu.hook.ts | 43 +++++++++++- 10 files changed, 212 insertions(+), 62 deletions(-) diff --git a/src/enums/editPageEnum.ts b/src/enums/editPageEnum.ts index e2044bd8..df395653 100644 --- a/src/enums/editPageEnum.ts +++ b/src/enums/editPageEnum.ts @@ -1,7 +1,7 @@ // 鼠标点击左右键 export enum MouseEventButton { LEFT = 1, - RIGHT = 2, + RIGHT = 2 } // 页面拖拽键名 @@ -41,7 +41,15 @@ export enum MenuEnum { // 后退 BACK = 'back', // 前进 - FORWORD = 'forward' + FORWORD = 'forward', + // 锁定 + LOCK = 'lock', + // 解除锁定 + UNLOCK = 'unLock', + // 隐藏 + HIDE = 'hide', + // 显示 + SHOW = 'show' } // Win 键盘枚举 @@ -49,9 +57,9 @@ export enum WinKeyboard { CTRL = 'ctrl', SHIFT = 'shift', ALT = ' alt', - CTRL_SOURCE_KEY = "control", - SHIFT_SOURCE_KEY = "shift", - ALT_SOURCE_KEY = "alt" + CTRL_SOURCE_KEY = 'control', + SHIFT_SOURCE_KEY = 'shift', + ALT_SOURCE_KEY = 'alt' } // Mac 键盘枚举 @@ -60,7 +68,7 @@ export enum MacKeyboard { CTRL = '⌘', SHIFT = '⇧', ALT = '⌥', - CTRL_SOURCE_KEY = "⌘", - SHIFT_SOURCE_KEY = "⇧", - ALT_SOURCE_KEY = "⌥" + CTRL_SOURCE_KEY = '⌘', + SHIFT_SOURCE_KEY = '⇧', + ALT_SOURCE_KEY = '⌥' } diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 32c55a94..455d6339 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -602,7 +602,8 @@ export const useChartEditStore = defineStore({ ids.push(item.id) }) } else { - (historyData[0] as CreateComponentGroupType).groupList.forEach(item => { + const group = historyData[0] as CreateComponentGroupType + group.groupList.forEach(item => { ids.push(item.id) }) } @@ -795,6 +796,70 @@ export const useChartEditStore = defineStore({ loadingFinish() } }, + // * 锁定 + setLock(status: boolean = true, isHistory: boolean = true) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const index: number = this.fetchTargetIndex() + if (index !== -1) { + // 更新状态 + const targetItem = this.getComponentList[index] + targetItem.status.lock = status + + // 历史记录 + if (isHistory) { + chartHistoryStore.createLayerHistory( + [targetItem], + status ? HistoryActionTypeEnum.LOCK : HistoryActionTypeEnum.UNLOCK + ) + } + this.updateComponentList(index, targetItem) + loadingFinish() + return + } + } catch (value) { + loadingError() + } + }, + // * 解除锁定 + setUnLock(isHistory: boolean = true) { + this.setLock(false, isHistory) + }, + // * 隐藏 + setHide(status: boolean = true, isHistory: boolean = true) { + try { + // 暂不支持多选 + if (this.getTargetChart.selectId.length > 1) return + + loadingStart() + const index: number = this.fetchTargetIndex() + if (index !== -1) { + // 更新状态 + const targetItem = this.getComponentList[index] + targetItem.status.hide = status + + // 历史记录 + if (isHistory) { + chartHistoryStore.createLayerHistory( + [targetItem], + status ? HistoryActionTypeEnum.HIDE : HistoryActionTypeEnum.SHOW + ) + } + this.updateComponentList(index, targetItem) + loadingFinish() + return + } + } catch (value) { + loadingError() + } + }, + // * 显示 + setShow(isHistory: boolean = true) { + this.setHide(false, isHistory) + }, // ---------------- // * 设置页面大小 setPageSize(scale: number): void { diff --git a/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts b/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts index 0ea7be39..e27240bb 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts @@ -2,6 +2,7 @@ import { CreateComponentType, CreateComponentGroupType } from '@/packages/index. import { EditCanvasType } from '@/store/modules/chartEditStore/chartEditStore.d' // 操作类型枚举 + export enum HistoryActionTypeEnum { // 新增 ADD = 'add', @@ -30,7 +31,15 @@ export enum HistoryActionTypeEnum { // 解组 UN_GROUP = 'unGroup', // 选择历史记录 - SELECT_HISTORY = 'selectHistory' + SELECT_HISTORY = 'selectHistory', + // 锁定 + LOCK = 'lock', + // 解除锁定 + UNLOCK = 'unLock', + // 隐藏 + HIDE = 'hide', + // 显示 + SHOW = 'show' } // 对象类型 diff --git a/src/store/modules/chartHistoryStore/chartHistoryStore.ts b/src/store/modules/chartHistoryStore/chartHistoryStore.ts index b8627ca6..63da3ff8 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryStore.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryStore.ts @@ -153,6 +153,10 @@ export const useChartHistoryStore = defineStore({ | HistoryActionTypeEnum.DOWN | HistoryActionTypeEnum.UP | HistoryActionTypeEnum.BOTTOM + | HistoryActionTypeEnum.LOCK + | HistoryActionTypeEnum.UNLOCK + | HistoryActionTypeEnum.HIDE + | HistoryActionTypeEnum.SHOW ) { this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) }, diff --git a/src/views/chart/ContentEdit/components/EditGroup/index.vue b/src/views/chart/ContentEdit/components/EditGroup/index.vue index c78b0b27..3a217c45 100644 --- a/src/views/chart/ContentEdit/components/EditGroup/index.vue +++ b/src/views/chart/ContentEdit/components/EditGroup/index.vue @@ -85,26 +85,32 @@ const optionsHandle = ( allList: MenuOptionsItemType[], targetInstance: CreateComponentType ) => { - // 多选 - const moreMenuEnums = [MenuEnum.GROUP, MenuEnum.DELETE] - // 单选 - const singleMenuEnums = [MenuEnum.UN_GROUP] - const filter = (menulist: MenuEnum[]) => { - const list: MenuOptionsItemType[] = [] - allList.forEach(item => { - if (menulist.includes(item.key as MenuEnum)) { - list.push(item) - } - }) - return list + return allList.filter(i => menulist.includes(i.key as MenuEnum)) } // 多选处理 if (chartEditStore.getTargetChart.selectId.length > 1) { - return filter(moreMenuEnums) + return filter([MenuEnum.GROUP, MenuEnum.DELETE]) } else { - return [...filter(singleMenuEnums), divider(), ...targetList] + const statusMenuEnums: MenuEnum[] = [] + if (targetInstance.status.lock) { + statusMenuEnums.push(MenuEnum.LOCK) + } else { + statusMenuEnums.push(MenuEnum.UNLOCK) + } + if (targetInstance.status.hide) { + statusMenuEnums.push(MenuEnum.HIDE) + } else { + statusMenuEnums.push(MenuEnum.SHOW) + } + // 单选 + const singleMenuEnums = [MenuEnum.UN_GROUP] + return [ + ...filter(singleMenuEnums), + divider(), + ...targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum)) + ] } } diff --git a/src/views/chart/ContentEdit/index.vue b/src/views/chart/ContentEdit/index.vue index 2f6d9cc3..02242ab5 100644 --- a/src/views/chart/ContentEdit/index.vue +++ b/src/views/chart/ContentEdit/index.vue @@ -114,24 +114,22 @@ const optionsHandle = ( allList: MenuOptionsItemType[], targetInstance: CreateComponentType ) => { - // 多选 - const moreMenuEnums = [MenuEnum.GROUP, MenuEnum.DELETE] - // 单选 - const singleMenuEnums = targetList - // 多选处理 if (chartEditStore.getTargetChart.selectId.length > 1) { - const list: MenuOptionsItemType[] = [] - - allList.forEach(item => { - // 成组 - if (moreMenuEnums.includes(item.key as MenuEnum)) { - list.push(item) - } - }) - return list + return allList.filter(i => [MenuEnum.GROUP, MenuEnum.DELETE].includes(i.key as MenuEnum)) } - return singleMenuEnums + const statusMenuEnums: MenuEnum[] = [] + if (targetInstance.status.lock) { + statusMenuEnums.push(MenuEnum.LOCK) + } else { + statusMenuEnums.push(MenuEnum.UNLOCK) + } + if (targetInstance.status.hide) { + statusMenuEnums.push(MenuEnum.HIDE) + } else { + statusMenuEnums.push(MenuEnum.SHOW) + } + return targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum)) } // 主题色 diff --git a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue index ae6d0418..c971276b 100644 --- a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -23,8 +23,8 @@ {{ componentGroupData.chartConfig.title }} </n-text> </n-ellipsis> - <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" /> - <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" /> + <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" v-if="status.lock" /> + <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" v-if="status.hide" /> </div> <div :class="{ 'select-modal': select }"></div> </div> @@ -95,20 +95,29 @@ const optionsHandle = ( targetInstance: CreateComponentType ) => { const filter = (menulist: MenuEnum[]) => { - const list: MenuOptionsItemType[] = [] - allList.forEach(item => { - if (menulist.includes(item.key as MenuEnum)) { - list.push(item) - } - }) - return list + return allList.filter(i => menulist.includes(i.key as MenuEnum)) } // 多选处理 if (chartEditStore.getTargetChart.selectId.length > 1) { return filter([MenuEnum.GROUP]) } else { - return [...filter([MenuEnum.UN_GROUP]), divider(), ...targetList] + const statusMenuEnums: MenuEnum[] = [] + if (targetInstance.status.lock) { + statusMenuEnums.push(MenuEnum.LOCK) + } else { + statusMenuEnums.push(MenuEnum.UNLOCK) + } + if (targetInstance.status.hide) { + statusMenuEnums.push(MenuEnum.HIDE) + } else { + statusMenuEnums.push(MenuEnum.SHOW) + } + return [ + ...filter([MenuEnum.UN_GROUP]), + divider(), + ...targetList.filter(i => !statusMenuEnums.includes(i.key as MenuEnum)) + ] } } @@ -136,6 +145,10 @@ const hover = computed(() => { return props.componentGroupData.id === chartEditStore.getTargetChart.hoverId }) +const status = computed(() => { + return props.componentGroupData.status +}) + // 组点击事件 const groupMousedownHandle = (e: MouseEvent) => { onClickOutSide() diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index e113e9bc..d37d8c63 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -13,8 +13,8 @@ {{ props.componentData.chartConfig.title }} </n-text> </n-ellipsis> - <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" /> - <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" /> + <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" v-if="status.lock" /> + <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" v-if="status.hide" /> </div> <div :class="{ 'select-modal': select }"></div> </div> @@ -64,6 +64,10 @@ const select = computed(() => { const hover = computed(() => { return props.componentData.id === chartEditStore.getTargetChart.hoverId }) + +const status = computed(() => { + return props.componentData.status +}) </script> <style lang="scss" scoped> diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index 6e32111b..54efde08 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -114,16 +114,20 @@ const optionsHandle = ( ) => { // 多选处理 if (chartEditStore.getTargetChart.selectId.length > 1) { - const list: MenuOptionsItemType[] = [] - targetList.forEach(item => { - // 成组 - if (item.key === MenuEnum.GROUP) { - list.push(item) - } - }) - return list + return targetList.filter(i => i.key === MenuEnum.GROUP) } - return targetList + const statusMenuEnums: MenuEnum[] = [] + if (targetInstance.status.lock) { + statusMenuEnums.push(MenuEnum.LOCK) + } else { + statusMenuEnums.push(MenuEnum.UNLOCK) + } + if (targetInstance.status.hide) { + statusMenuEnums.push(MenuEnum.HIDE) + } else { + statusMenuEnums.push(MenuEnum.SHOW) + } + return targetList.filter(item => !statusMenuEnums.includes(item.key as MenuEnum)) } // 缩小 diff --git a/src/views/chart/hooks/useContextMenu.hook.ts b/src/views/chart/hooks/useContextMenu.hook.ts index d6e0adb2..f79447cc 100644 --- a/src/views/chart/hooks/useContextMenu.hook.ts +++ b/src/views/chart/hooks/useContextMenu.hook.ts @@ -7,7 +7,18 @@ import { MenuOptionsItemType } from './useContextMenu.hook.d' import { MenuEnum } from '@/enums/editPageEnum' import cloneDeep from 'lodash/cloneDeep' -const { CopyIcon, CutIcon, ClipboardOutlineIcon, TrashIcon, ChevronDownIcon, ChevronUpIcon } = icon.ionicons5 +const { + CopyIcon, + CutIcon, + ClipboardOutlineIcon, + TrashIcon, + ChevronDownIcon, + ChevronUpIcon, + LockOpenOutlineIcon, + LockClosedOutlineIcon, + EyeOutlineIcon, + EyeOffOutlineIcon +} = icon.ionicons5 const { UpToTopIcon, DownToBottomIcon, PaintBrushIcon, Carbon3DSoftwareIcon, Carbon3DCursorIcon } = icon.carbon const chartEditStore = useChartEditStore() @@ -17,7 +28,7 @@ const chartEditStore = useChartEditStore() * @param {number} n > 2 * @returns */ -export const divider = (n:number = 3) => { +export const divider = (n: number = 3) => { return { type: 'divider', key: `d${n}` @@ -26,6 +37,34 @@ export const divider = (n:number = 3) => { // * 默认单组件选项 export const defaultOptions: MenuOptionsItemType[] = [ + { + label: '锁定', + key: MenuEnum.LOCK, + icon: renderIcon(LockClosedOutlineIcon), + fnHandle: chartEditStore.setLock + }, + { + label: '解除锁定', + key: MenuEnum.UNLOCK, + icon: renderIcon(LockOpenOutlineIcon), + fnHandle: chartEditStore.setUnLock + }, + { + label: '隐藏', + key: MenuEnum.HIDE, + icon: renderIcon(EyeOffOutlineIcon), + fnHandle: chartEditStore.setHide + }, + { + label: '显示', + key: MenuEnum.SHOW, + icon: renderIcon(EyeOutlineIcon), + fnHandle: chartEditStore.setShow + }, + { + type: 'divider', + key: 'd0' + }, { label: '复制', key: MenuEnum.COPY, From abbf678e89d8fbb92319dbe92100c0b713cb77ab Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 17:34:11 +0800 Subject: [PATCH 04/56] =?UTF-8?q?fix:=20=E9=9A=90=E8=97=8F=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E7=AB=8B=E5=8D=B3=E5=8F=96=E6=B6=88=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/chartEditStore/chartEditStore.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 455d6339..f3fc4356 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -850,6 +850,12 @@ export const useChartEditStore = defineStore({ } this.updateComponentList(index, targetItem) loadingFinish() + + // 取消选择隐藏 + if (status) { + const chartEditStore = useChartEditStore() + chartEditStore.setTargetSelectChart(undefined) + } return } } catch (value) { From e49cf3dea2eb3584c7ab2f5f6013390a90358fa6 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 17:37:09 +0800 Subject: [PATCH 05/56] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E7=BB=84=E4=BB=B6=20hover=20=E5=92=8C=20select=20?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContentEdit/components/EditShapeBox/index.vue | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue index b7b3bd65..a1d162df 100644 --- a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue +++ b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue @@ -1,5 +1,5 @@ <template> - <div class="go-shape-box"> + <div class="go-shape-box" :class="{ lock: item.status.lock, hide: item.status.hide }"> <slot></slot> <!-- 锚点 --> <template v-if="!hiddenPoint"> @@ -55,12 +55,14 @@ const themeColor = computed(() => { // 计算当前选中目标 const hover = computed(() => { + if (props.item.status.lock) return false return props.item.id === chartEditStore.getTargetChart.hoverId }) // 兼容多值场景 const select = computed(() => { const id = props.item.id + if (props.item.status.lock) return false return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) }) </script> @@ -70,6 +72,14 @@ const select = computed(() => { position: absolute; cursor: move; + &.lock { + cursor: default !important; + } + + &.hide { + display: none; + } + /* 锚点 */ .shape-point { z-index: 1; From cc97672fcc0a876c3942bdf8002b7dfe9694b8b6 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 17:38:15 +0800 Subject: [PATCH 06/56] =?UTF-8?q?feat:=20=E9=94=81=E5=AE=9A=E5=92=8C?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E7=BB=84=E4=BB=B6=E4=B8=8D=E8=83=BD=E8=A2=AB?= =?UTF-8?q?=E6=A1=86=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/chart/ContentEdit/hooks/useDrag.hook.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts index 2e2218b6..9c412bc3 100644 --- a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts +++ b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts @@ -140,7 +140,9 @@ export const mousedownBoxSelect = (e: MouseEvent, item?: CreateComponentType | C targetAttr.x1 - selectAttr.x1 >= 0 && targetAttr.y1 - selectAttr.y1 >= 0 && targetAttr.x2 - selectAttr.x2 <= 0 && - targetAttr.y2 - selectAttr.y2 <= 0 + targetAttr.y2 - selectAttr.y2 <= 0 && + !item.status.lock && + !item.status.hide ) { isSelect = true chartEditStore.setTargetSelectChart(item.id, true) From 2c834c1d62120c4fad919dff8f53301a934a1841 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 17:51:59 +0800 Subject: [PATCH 07/56] =?UTF-8?q?feat:=20=E9=94=81=E5=AE=9A=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=8D=E8=83=BD=E9=80=89=E4=B8=AD=E5=92=8C=E6=8B=96?= =?UTF-8?q?=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/chart/ContentEdit/hooks/useDrag.hook.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts index 9c412bc3..995a1427 100644 --- a/src/views/chart/ContentEdit/hooks/useDrag.hook.ts +++ b/src/views/chart/ContentEdit/hooks/useDrag.hook.ts @@ -168,6 +168,7 @@ export const useMouseHandle = () => { const mouseClickHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { e.preventDefault() e.stopPropagation() + if (item.status.lock) return // 若此时按下了 CTRL, 表示多选 if ( window.$KeyboardActive?.has(WinKeyboard.CTRL_SOURCE_KEY) || @@ -187,6 +188,7 @@ export const useMouseHandle = () => { const mousedownHandle = (e: MouseEvent, item: CreateComponentType | CreateComponentGroupType) => { e.preventDefault() e.stopPropagation() + if (item.status.lock) return onClickOutSide() // 按下左键 + CTRL if ( From c22d559195140d2b5c39e533883274e4bd79a278 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 18:43:55 +0800 Subject: [PATCH 08/56] =?UTF-8?q?feat:=20=E9=9A=90=E8=97=8F=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E6=93=8D=E4=BD=9C=EF=BC=8C=E6=94=AF=E6=8C=81=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95=E5=9B=9E=E9=80=80=E5=92=8C=E5=89=8D?= =?UTF-8?q?=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/chartEditStore/chartEditStore.ts | 30 +++++++++++++++++-- .../chartHistoryStore/chartHistoryDefine.ts | 11 +++---- .../chartHistoryStore/chartHistoryStore.ts | 18 ++++++++--- .../components/EditHistory/index.vue | 27 +++++++++++++---- 4 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index f3fc4356..6db94d74 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -618,6 +618,32 @@ export const useChartEditStore = defineStore({ } return } + + switch (HistoryItem.actionType) { + // 锁定处理 + case HistoryActionTypeEnum.LOCK: + case HistoryActionTypeEnum.UNLOCK: + if (!isForward) { + // 恢复原来状态 + if (HistoryItem.actionType === HistoryActionTypeEnum.LOCK) historyData[0].status.lock = false + if (HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK) historyData[0].status.lock = true + return + } + this.setLock(!historyData[0].status.lock, false) + break + + // 隐藏处理 + case HistoryActionTypeEnum.HIDE: + case HistoryActionTypeEnum.SHOW: + if (!isForward) { + // 恢复原来状态 + if (HistoryItem.actionType === HistoryActionTypeEnum.HIDE) historyData[0].status.hide = false + if (HistoryItem.actionType === HistoryActionTypeEnum.SHOW) historyData[0].status.hide = true + return + } + this.setHide(!historyData[0].status.hide, false) + break + } }, // * 撤回 setBack() { @@ -811,7 +837,7 @@ export const useChartEditStore = defineStore({ // 历史记录 if (isHistory) { - chartHistoryStore.createLayerHistory( + chartHistoryStore.createLockHistory( [targetItem], status ? HistoryActionTypeEnum.LOCK : HistoryActionTypeEnum.UNLOCK ) @@ -843,7 +869,7 @@ export const useChartEditStore = defineStore({ // 历史记录 if (isHistory) { - chartHistoryStore.createLayerHistory( + chartHistoryStore.createHideHistory( [targetItem], status ? HistoryActionTypeEnum.HIDE : HistoryActionTypeEnum.SHOW ) diff --git a/src/store/modules/chartHistoryStore/chartHistoryDefine.ts b/src/store/modules/chartHistoryStore/chartHistoryDefine.ts index a3f70d7c..7c38de1b 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryDefine.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryDefine.ts @@ -1,7 +1,4 @@ -import { - HistoryTargetTypeEnum, - HistoryActionTypeEnum -} from './chartHistoryStore.d' +import { HistoryTargetTypeEnum, HistoryActionTypeEnum } from './chartHistoryStore.d' export const historyActionTypeName = { [HistoryActionTypeEnum.ADD]: '新增图表', @@ -18,6 +15,10 @@ export const historyActionTypeName = { [HistoryActionTypeEnum.GROUP]: '创建分组', [HistoryActionTypeEnum.UN_GROUP]: '解除分组', [HistoryActionTypeEnum.SELECT_HISTORY]: '选择记录', - + [HistoryActionTypeEnum.LOCK]: '锁定', + [HistoryActionTypeEnum.UNLOCK]: '解除锁定', + [HistoryActionTypeEnum.HIDE]: '隐藏', + [HistoryActionTypeEnum.SHOW]: '显示', + [HistoryTargetTypeEnum.CANVAS]: '画布初始化' } diff --git a/src/store/modules/chartHistoryStore/chartHistoryStore.ts b/src/store/modules/chartHistoryStore/chartHistoryStore.ts index 63da3ff8..b773300b 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryStore.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryStore.ts @@ -153,10 +153,6 @@ export const useChartHistoryStore = defineStore({ | HistoryActionTypeEnum.DOWN | HistoryActionTypeEnum.UP | HistoryActionTypeEnum.BOTTOM - | HistoryActionTypeEnum.LOCK - | HistoryActionTypeEnum.UNLOCK - | HistoryActionTypeEnum.HIDE - | HistoryActionTypeEnum.SHOW ) { this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) }, @@ -171,6 +167,20 @@ export const useChartHistoryStore = defineStore({ // * 解除分组 createUnGroupHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { this.createStackItem(item, HistoryActionTypeEnum.UN_GROUP, HistoryTargetTypeEnum.CHART) + }, + // * 锁定记录 + createLockHistory( + item: Array<CreateComponentType | CreateComponentGroupType>, + type: HistoryActionTypeEnum.LOCK | HistoryActionTypeEnum.UNLOCK + ) { + this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) + }, + // * 隐藏记录 + createHideHistory( + item: Array<CreateComponentType | CreateComponentGroupType>, + type: HistoryActionTypeEnum.HIDE | HistoryActionTypeEnum.SHOW + ) { + this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) } } }) diff --git a/src/views/chart/ContentEdit/components/EditHistory/index.vue b/src/views/chart/ContentEdit/components/EditHistory/index.vue index 4346905b..4ad642bb 100644 --- a/src/views/chart/ContentEdit/components/EditHistory/index.vue +++ b/src/views/chart/ContentEdit/components/EditHistory/index.vue @@ -48,8 +48,19 @@ import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d' -const { DesktopOutlineIcon, PencilIcon, TrashIcon, CopyIcon, LayersIcon, DuplicateIcon, HelpOutlineIcon } = - icon.ionicons5 +const { + DesktopOutlineIcon, + PencilIcon, + TrashIcon, + CopyIcon, + LayersIcon, + DuplicateIcon, + HelpOutlineIcon, + LockClosedOutlineIcon, + LockOpenOutlineIcon, + EyeOffOutlineIcon, + EyeOutlineIcon +} = icon.ionicons5 const { StackedMoveIcon, Carbon3DCursorIcon, Carbon3DSoftwareIcon } = icon.carbon const chartHistoryStoreStore = useChartHistoryStore() @@ -83,6 +94,14 @@ const iconHandle = (e: HistoryItemType) => { return Carbon3DCursorIcon case HistoryActionTypeEnum.UN_GROUP: return Carbon3DSoftwareIcon + case HistoryActionTypeEnum.LOCK: + return LockClosedOutlineIcon + case HistoryActionTypeEnum.UNLOCK: + return LockOpenOutlineIcon + case HistoryActionTypeEnum.HIDE: + return EyeOffOutlineIcon + case HistoryActionTypeEnum.SHOW: + return EyeOutlineIcon default: return PencilIcon } @@ -109,9 +128,7 @@ const options = computed(() => { } }) - return reverse(options.filter(item => { - return item.label - })) + return reverse(options.filter(item => item.label)) }) </script> From a8211c6a4150a3ddcfa716c6b4d8c0b4bc395469 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: Wed, 28 Sep 2022 21:31:41 +0800 Subject: [PATCH 09/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B1=82?= =?UTF-8?q?=E7=BA=A7=E7=9A=84=20UI=20=E6=A0=B7=E5=BC=8F,=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E5=9B=BE=E6=A0=87=E5=AE=8C=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/LayersGroupListItem/index.vue | 68 ++++++++++------- .../components/LayersListItem/index.vue | 62 ++++++++------- .../components/LayersStatus/index.ts | 3 + .../components/LayersStatus/index.vue | 75 +++++++++++++++++++ src/views/chart/ContentLayers/enums.ts | 1 - src/views/chart/ContentLayers/index.d.ts | 4 + src/views/chart/ContentLayers/index.vue | 4 +- 7 files changed, 158 insertions(+), 59 deletions(-) create mode 100644 src/views/chart/ContentLayers/components/LayersStatus/index.ts create mode 100644 src/views/chart/ContentLayers/components/LayersStatus/index.vue create mode 100644 src/views/chart/ContentLayers/index.d.ts diff --git a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue index c971276b..8fb6abb1 100644 --- a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -2,7 +2,7 @@ <div class="go-content-layers-group-list-item"> <div class="root-item-content" - :class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }" + :class="{ hover: hover, select: select, 'list-mini': selectText }" @click="clickHandle($event)" @mousedown="groupMousedownHandle($event)" @mouseenter="mouseenterHandle(componentGroupData)" @@ -23,8 +23,7 @@ {{ componentGroupData.chartConfig.title }} </n-text> </n-ellipsis> - <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" v-if="status.lock" /> - <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" v-if="status.hide" /> + <layers-status :isGroup="false" :hover="hover" :status="status"></layers-status> </div> <div :class="{ 'select-modal': select }"></div> </div> @@ -34,6 +33,7 @@ :key="element.id" :componentData="element" :layer-mode="layerMode" + :isGroup="true" @mousedown="mousedownHandle($event, element, componentGroupData.id)" @mouseenter="mouseenterHandle(element)" @mouseleave="mouseleaveHandle(element)" @@ -53,10 +53,9 @@ import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { LayersListItem } from '../LayersListItem' +import { LayersStatus } from '../LayersStatus/index' +import { LayerModeEnum } from '../../index.d' import { icon } from '@/plugins' -import { LayerModeEnum } from '../../enums' - -const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 const props = defineProps({ componentGroupData: { @@ -64,10 +63,8 @@ const props = defineProps({ required: true }, layerMode: { - type: Object as PropType<LayerModeEnum>, - default(): LayerModeEnum { - return 'thumbnail' - } + type: String as PropType<LayerModeEnum>, + default: LayerModeEnum.THUMBNAIL } }) @@ -88,6 +85,27 @@ const themeColor = computed(() => { return designStore.getAppTheme }) +// 是否选中文本 +const selectText = computed(() => { + return props.layerMode === LayerModeEnum.TEXT +}) + +// 计算当前选中目标 +const select = computed(() => { + const id = props.componentGroupData.id + return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) +}) + +// 悬浮 +const hover = computed(() => { + return props.componentGroupData.id === chartEditStore.getTargetChart.hoverId +}) + +// 组件状态 隐藏/锁定 +const status = computed(() => { + return props.componentGroupData.status +}) + // 右键 const optionsHandle = ( targetList: MenuOptionsItemType[], @@ -134,21 +152,6 @@ const clickHandle = (e: MouseEvent) => { mousedownHandle(e, props.componentGroupData) } -// 计算当前选中目标 -const select = computed(() => { - const id = props.componentGroupData.id - return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) -}) - -// 悬浮 -const hover = computed(() => { - return props.componentGroupData.id === chartEditStore.getTargetChart.hoverId -}) - -const status = computed(() => { - return props.componentGroupData.status -}) - // 组点击事件 const groupMousedownHandle = (e: MouseEvent) => { onClickOutSide() @@ -206,10 +209,19 @@ $textSize: 10px; margin: 10px 5%; margin-bottom: 5px; @extend .go-transition-quick; + @include deep() { + .go-content-layers-list-item { + margin-right: 0 !important; + width: 95% !important; + } + } - :deep(.go-content-layers-list-item) { - margin-right: 0 !important; - width: 95% !important; + &:hover { + @include deep() { + .icon-item { + opacity: 1; + } + } } .root-item-content { diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index d37d8c63..2b7ecf48 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -1,5 +1,5 @@ <template> - <div class="go-content-layers-list-item" :class="{ hover: hover, select: select, 'list-mini': layerMode === 'text' }"> + <div class="go-content-layers-list-item" :class="{ hover: hover, select: select, 'list-mini': selectText }"> <div class="go-flex-center item-content"> <n-image class="list-img" @@ -13,61 +13,67 @@ {{ props.componentData.chartConfig.title }} </n-text> </n-ellipsis> - <n-icon size="12" class="list-status-icon" :component="LockClosedOutlineIcon" v-if="status.lock" /> - <n-icon size="12" class="list-status-icon" :component="EyeOffOutlineIcon" v-if="status.hide" /> + <layers-status :isGroup="isGroup" :hover="hover" :status="status"></layers-status> </div> <div :class="{ 'select-modal': select }"></div> </div> </template> <script setup lang="ts"> -import { toRefs, computed, PropType } from 'vue' +import { computed, PropType } from 'vue' import { requireErrorImg } from '@/utils' import { useDesignStore } from '@/store/modules/designStore/designStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { LayerModeEnum } from '../../enums' - -import { icon } from '@/plugins' -const { LockClosedOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 - -// 全局颜色 -const designStore = useDesignStore() -const chartEditStore = useChartEditStore() - -// 颜色 -const themeColor = computed(() => { - return designStore.getAppTheme -}) +import { LayersStatus } from '../LayersStatus/index' +import { LayerModeEnum } from '../../index.d' const props = defineProps({ componentData: { type: Object, required: true }, + isGroup: { + type: Boolean, + default: false + }, layerMode: { - type: Object as PropType<LayerModeEnum>, - default(): LayerModeEnum { - return 'thumbnail' - } + type: String as PropType<LayerModeEnum>, + default: LayerModeEnum.THUMBNAIL } }) +// 全局颜色 +const designStore = useDesignStore() +const chartEditStore = useChartEditStore() + // eslint-disable-next-line vue/no-setup-props-destructure const { image } = props.componentData.chartConfig +// 颜色 +const themeColor = computed(() => { + return designStore.getAppTheme +}) + // 计算当前选中目标 const select = computed(() => { const id = props.componentData.id return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) }) +// 悬浮对象 const hover = computed(() => { return props.componentData.id === chartEditStore.getTargetChart.hoverId }) +// 组件状态 隐藏/锁定 const status = computed(() => { return props.componentData.status }) + +// 是否选中文本 +const selectText = computed(() => { + return props.layerMode === LayerModeEnum.TEXT +}) </script> <style lang="scss" scoped> @@ -89,6 +95,13 @@ $textSize: 10px; &:hover { @include fetch-bg-color('background-color4'); } + &:hover { + @include deep() { + .icon-item { + opacity: 1; + } + } + } .select-modal, .item-content { @@ -126,18 +139,11 @@ $textSize: 10px; font-size: $textSize; } - .list-status-icon { - margin-left: 3px; - } - /* 选中样式 */ &.select { border: 1px solid v-bind('themeColor'); /* 需要设置最高级,覆盖 hover 的颜色 */ background-color: rgba(0, 0, 0, 0); - // .list-img { - // border: 1px solid v-bind('themeColor') !important; - // } } // mini样式 diff --git a/src/views/chart/ContentLayers/components/LayersStatus/index.ts b/src/views/chart/ContentLayers/components/LayersStatus/index.ts new file mode 100644 index 00000000..220d5c25 --- /dev/null +++ b/src/views/chart/ContentLayers/components/LayersStatus/index.ts @@ -0,0 +1,3 @@ +import LayersStatus from './index.vue' + +export { LayersStatus } diff --git a/src/views/chart/ContentLayers/components/LayersStatus/index.vue b/src/views/chart/ContentLayers/components/LayersStatus/index.vue new file mode 100644 index 00000000..4179e765 --- /dev/null +++ b/src/views/chart/ContentLayers/components/LayersStatus/index.vue @@ -0,0 +1,75 @@ +<template> + <div v-show="!isGroup"> + <n-icon + class="go-ml-1 icon-item" + :class="{ active: status.lock }" + size="15" + :component="status.lock ? LockClosedOutlineIcon : LockOpenOutlineIcon" + @click="lockHandle" + /> + <n-icon + class="go-ml-1 icon-item" + :class="{ active: status.hide }" + size="15" + :component="status.hide ? EyeOffOutlineIcon : EyeOutlineIcon" + @click="showHandle" + /> + </div> +</template> + +<script setup lang="ts"> +import { computed, PropType } from 'vue' +import { LayerModeEnum } from '../../index.d' +import { PublicConfigType } from '@/packages/index.d' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { icon } from '@/plugins' + +const props = defineProps({ + isGroup: { + type: Boolean, + default: false + }, + hover: { + type: Boolean, + default: false + }, + status: { + type: Object as PropType<Pick<PublicConfigType, 'status'>>, + default: () => ({ + lock: false, + hide: false + }) + } +}) + +const { LockClosedOutlineIcon, LockOpenOutlineIcon, EyeOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 +const chartEditStore = useChartEditStore() + +// 隐藏 / 展示 +const showHandle = (e: MouseEvent) => { + e.stopPropagation() + props.status.hide ? chartEditStore.setShow() : chartEditStore.setHide() +} + +// 锁定 / 解锁 +const lockHandle = (e: MouseEvent) => { + e.stopPropagation() + props.status.lock ? chartEditStore.setUnLock() : chartEditStore.setLock() +} +</script> + +<style lang="scss" scoped> +$activeColor: #ebcb87; + +.icon-item { + opacity: 0; + padding-top: 5px; + &.active, + &:hover { + color: $activeColor; + } + &.active { + opacity: 1 !important; + } +} +</style> diff --git a/src/views/chart/ContentLayers/enums.ts b/src/views/chart/ContentLayers/enums.ts index 0cb26ab2..e69de29b 100644 --- a/src/views/chart/ContentLayers/enums.ts +++ b/src/views/chart/ContentLayers/enums.ts @@ -1 +0,0 @@ -export type LayerModeEnum = 'thumbnail' | 'text' diff --git a/src/views/chart/ContentLayers/index.d.ts b/src/views/chart/ContentLayers/index.d.ts new file mode 100644 index 00000000..06596dee --- /dev/null +++ b/src/views/chart/ContentLayers/index.d.ts @@ -0,0 +1,4 @@ +export enum LayerModeEnum { + THUMBNAIL = 'thumbnail', + TEXT = 'text' +} diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index 54efde08..c3323410 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -17,7 +17,7 @@ v-for="(item, index) in layerModeEnumList" :key="index" ghost - size="tiny" + size="small" :type="layerMode === item.value ? 'primary' : 'tertiary'" @click="layerMode = item.value as LayerModeEnum" > @@ -77,7 +77,7 @@ import { MenuEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/ed import { LayersListItem } from './components/LayersListItem/index' import { LayersGroupListItem } from './components/LayersGroupListItem/index' -import { LayerModeEnum } from './enums' +import { LayerModeEnum } from './index.d' import { icon } from '@/plugins' From 6f5d1d94591892437e531b9c2fcb3e8a66bcca60 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: Wed, 28 Sep 2022 21:39:31 +0800 Subject: [PATCH 10/56] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=94=81?= =?UTF-8?q?=E5=AE=9A=E5=92=8C=E9=9A=90=E8=97=8F=E5=A4=B1=E7=84=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/chartEditStore/chartEditStore.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 6db94d74..41d2be22 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -843,6 +843,7 @@ export const useChartEditStore = defineStore({ ) } this.updateComponentList(index, targetItem) + this.setTargetSelectChart(undefined) loadingFinish() return } @@ -875,6 +876,7 @@ export const useChartEditStore = defineStore({ ) } this.updateComponentList(index, targetItem) + this.setTargetSelectChart(undefined) loadingFinish() // 取消选择隐藏 @@ -882,7 +884,6 @@ export const useChartEditStore = defineStore({ const chartEditStore = useChartEditStore() chartEditStore.setTargetSelectChart(undefined) } - return } } catch (value) { loadingError() From 1aade9c4b867a42357f1910e9b81f4637ad13f2b Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 28 Sep 2022 22:16:08 +0800 Subject: [PATCH 11/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=BB=84=E4=BB=B6=E9=A2=84=E8=A7=88=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E4=B8=8B=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/preview/components/PreviewRenderGroup/index.vue | 1 + src/views/preview/components/PreviewRenderList/index.vue | 1 + 2 files changed, 2 insertions(+) diff --git a/src/views/preview/components/PreviewRenderGroup/index.vue b/src/views/preview/components/PreviewRenderGroup/index.vue index d5bdf767..4d0a813e 100644 --- a/src/views/preview/components/PreviewRenderGroup/index.vue +++ b/src/views/preview/components/PreviewRenderGroup/index.vue @@ -9,6 +9,7 @@ ...getFilterStyle(item.styles), ...getTransformStyle(item.styles) }" + v-show="!item.status.hide" > <component :is="item.chartConfig.chartKey" diff --git a/src/views/preview/components/PreviewRenderList/index.vue b/src/views/preview/components/PreviewRenderList/index.vue index c943be66..a841315f 100644 --- a/src/views/preview/components/PreviewRenderList/index.vue +++ b/src/views/preview/components/PreviewRenderList/index.vue @@ -9,6 +9,7 @@ ...getFilterStyle(item.styles), ...getTransformStyle(item.styles) }" + v-show="!item.status.hide" > <!-- 分组 --> <preview-render-group From 6ea3f0701e0d9a3adababbd8cd8b847414990b34 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: Thu, 29 Sep 2022 09:12:05 +0800 Subject: [PATCH 12/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B1=82?= =?UTF-8?q?=E7=BA=A7UI=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContentLayers/components/LayersStatus/index.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/views/chart/ContentLayers/components/LayersStatus/index.vue b/src/views/chart/ContentLayers/components/LayersStatus/index.vue index 4179e765..648d0842 100644 --- a/src/views/chart/ContentLayers/components/LayersStatus/index.vue +++ b/src/views/chart/ContentLayers/components/LayersStatus/index.vue @@ -19,9 +19,10 @@ <script setup lang="ts"> import { computed, PropType } from 'vue' -import { LayerModeEnum } from '../../index.d' +import { useDesignStore } from '@/store/modules/designStore/designStore' import { PublicConfigType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { LayerModeEnum } from '../../index.d' import { icon } from '@/plugins' const props = defineProps({ @@ -44,6 +45,12 @@ const props = defineProps({ const { LockClosedOutlineIcon, LockOpenOutlineIcon, EyeOutlineIcon, EyeOffOutlineIcon } = icon.ionicons5 const chartEditStore = useChartEditStore() +const designStore = useDesignStore() + +// 颜色 +const themeColor = computed(() => { + return designStore.getAppTheme +}) // 隐藏 / 展示 const showHandle = (e: MouseEvent) => { @@ -59,7 +66,7 @@ const lockHandle = (e: MouseEvent) => { </script> <style lang="scss" scoped> -$activeColor: #ebcb87; +$activeColor: v-bind('themeColor'); .icon-item { opacity: 0; From b66205eda9cbc7049cfd0be7935c1a7232258d02 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: Thu, 29 Sep 2022 09:55:11 +0800 Subject: [PATCH 13/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=B1=82?= =?UTF-8?q?=E7=BA=A7=E5=B1=95=E7=A4=BA,=20=E4=BC=98=E5=8C=96=E5=A4=B1?= =?UTF-8?q?=E7=84=A6=E9=9A=90=E8=97=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/chartEditStore/chartEditStore.ts | 11 +++----- .../components/LayersStatus/index.vue | 25 +++++++++++-------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 41d2be22..131e8763 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -843,7 +843,8 @@ export const useChartEditStore = defineStore({ ) } this.updateComponentList(index, targetItem) - this.setTargetSelectChart(undefined) + // 锁定添加失焦效果 + if(status) this.setTargetSelectChart(undefined) loadingFinish() return } @@ -876,14 +877,10 @@ export const useChartEditStore = defineStore({ ) } this.updateComponentList(index, targetItem) - this.setTargetSelectChart(undefined) loadingFinish() - // 取消选择隐藏 - if (status) { - const chartEditStore = useChartEditStore() - chartEditStore.setTargetSelectChart(undefined) - } + // 隐藏添加失焦效果 + if (status) this.setTargetSelectChart(undefined) } } catch (value) { loadingError() diff --git a/src/views/chart/ContentLayers/components/LayersStatus/index.vue b/src/views/chart/ContentLayers/components/LayersStatus/index.vue index 648d0842..e0cc2547 100644 --- a/src/views/chart/ContentLayers/components/LayersStatus/index.vue +++ b/src/views/chart/ContentLayers/components/LayersStatus/index.vue @@ -1,5 +1,5 @@ <template> - <div v-show="!isGroup"> + <div class="icon-item-box" v-show="!isGroup"> <n-icon class="go-ml-1 icon-item" :class="{ active: status.lock }" @@ -68,15 +68,20 @@ const lockHandle = (e: MouseEvent) => { <style lang="scss" scoped> $activeColor: v-bind('themeColor'); -.icon-item { - opacity: 0; - padding-top: 5px; - &.active, - &:hover { - color: $activeColor; - } - &.active { - opacity: 1 !important; +.icon-item-box { + white-space: nowrap; + + .icon-item { + opacity: 0; + padding-top: 5px; + @extend.go-transition; + &.active, + &:hover { + color: $activeColor; + } + &.active { + opacity: 1 !important; + } } } </style> From dd13a0844b40909059a1c3e032013d906157d0b1 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: Thu, 29 Sep 2022 10:10:54 +0800 Subject: [PATCH 14/56] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContentEdit/components/EditShapeBox/index.vue | 12 +++++++++++- .../components/LayersGroupListItem/index.vue | 2 +- .../components/LayersListItem/index.vue | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue index a1d162df..b509b32b 100644 --- a/src/views/chart/ContentEdit/components/EditShapeBox/index.vue +++ b/src/views/chart/ContentEdit/components/EditShapeBox/index.vue @@ -1,5 +1,5 @@ <template> - <div class="go-shape-box" :class="{ lock: item.status.lock, hide: item.status.hide }"> + <div class="go-shape-box" :class="{ lock, hide }"> <slot></slot> <!-- 锚点 --> <template v-if="!hiddenPoint"> @@ -65,6 +65,16 @@ const select = computed(() => { if (props.item.status.lock) return false return chartEditStore.getTargetChart.selectId.find((e: string) => e === id) }) + +// 锁定 +const lock = computed(() => { + return props.item.status.lock +}) + +// 隐藏 +const hide = computed(() => { + return props.item.status.hide +}) </script> <style lang="scss" scoped> diff --git a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue index 8fb6abb1..d9156753 100644 --- a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -2,7 +2,7 @@ <div class="go-content-layers-group-list-item"> <div class="root-item-content" - :class="{ hover: hover, select: select, 'list-mini': selectText }" + :class="{ hover, select, 'list-mini': selectText }" @click="clickHandle($event)" @mousedown="groupMousedownHandle($event)" @mouseenter="mouseenterHandle(componentGroupData)" diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index 2b7ecf48..8562b55f 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -1,5 +1,5 @@ <template> - <div class="go-content-layers-list-item" :class="{ hover: hover, select: select, 'list-mini': selectText }"> + <div class="go-content-layers-list-item" :class="{ hover, select, 'list-mini': selectText }"> <div class="go-flex-center item-content"> <n-image class="list-img" From 885387cb5af904e36350ec070572fa5e76b22d5f Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 10:32:17 +0800 Subject: [PATCH 15/56] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E7=BF=BB=E7=89=8C=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.ts | 3 + src/components/Flipper/index.vue | 257 +++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 src/components/Flipper/index.ts create mode 100644 src/components/Flipper/index.vue diff --git a/src/components/Flipper/index.ts b/src/components/Flipper/index.ts new file mode 100644 index 00000000..bf785165 --- /dev/null +++ b/src/components/Flipper/index.ts @@ -0,0 +1,3 @@ +import Flipper from './index.vue' + +export { Flipper } diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue new file mode 100644 index 00000000..8ccc7696 --- /dev/null +++ b/src/components/Flipper/index.vue @@ -0,0 +1,257 @@ +<template> + <div class="M-Flipper" :class="[flipType, { go: isFlipping }]"> + <div class="digital front" :class="_textClass(frontTextFromData)"></div> + <div class="digital back" :class="_textClass(backTextFromData)"></div> + </div> +</template> + +<script lang="ts" setup> +import { ref } from 'vue' +type FlipType = 'up' | 'down' + +const name = 'Flipper' + +const props = defineProps({ + frontText: { + type: [Number, String], + default: 0 + }, + backText: { + type: [Number, String], + default: 1 + }, + duration: { + type: Number, + default: 600 + }, + width: { + type: Number, + default: 60 + }, + height: { + type: Number, + default: 100 + }, + radius: { + type: Number, + default: 10 + }, + frontColor: { + type: String, + default: '#ffffff' + }, + backColor: { + type: String, + default: '#000000' + } +}) + +const isFlipping = ref(false) +const flipType = ref<FlipType>('down') +const frontTextFromData = ref(props.frontText) +const backTextFromData = ref(props.backText) + +const _textClass = (number: string | number) => `number${number}` +const _flip = (type: FlipType, front: string | number, back: string | number) => { + // 如果处于翻转中,则不执行 + if (isFlipping.value) return + frontTextFromData.value = front + backTextFromData.value = back + // 根据传递过来的type设置翻转方向 + flipType.value = type + // 设置翻转状态为true + isFlipping.value = true + setTimeout(() => { + // 设置翻转状态为false + isFlipping.value = false + frontTextFromData.value = back + }, props.duration) +} +// 下翻牌 +const flipDown = (front: string | number, back: string | number) => _flip('down', front, back) +// 上翻牌 +const flipUp = (front: string | number, back: string | number) => _flip('up', front, back) +// 设置前牌文字 +const setFront = (text: string | number) => { + frontTextFromData.value = text +} +// 设置后牌文字 +const setBack = (text: string | number) => { + backTextFromData.value = text +} + +defineExpose({ + name, + flipDown, + flipUp +}) +</script> + +<style lang="scss" scoped> +@keyframes frontFlipDown { + 0% { + transform: perspective(160px) rotateX(0deg); + } + 100% { + transform: perspective(160px) rotateX(-180deg); + } +} +@keyframes backFlipDown { + 0% { + transform: perspective(160px) rotateX(180deg); + } + 100% { + transform: perspective(160px) rotateX(0deg); + } +} +@keyframes frontFlipUp { + 0% { + transform: perspective(160px) rotateX(0deg); + } + 100% { + transform: perspective(160px) rotateX(180deg); + } +} +@keyframes backFlipUp { + 0% { + transform: perspective(160px) rotateX(-180deg); + } + 100% { + transform: perspective(160px) rotateX(0deg); + } +} + +$frontColor: v-bind('props.frontColor'); +$backColor: v-bind('props.backColor'); +$radius: v-bind('props.radius'); + +.M-Flipper { + display: inline-block; + position: relative; + width: v-bind('`${width}px`'); + height: v-bind('`${height}px`'); + line-height: v-bind('`${height}px`'); + border: solid 1px $backColor; + border-radius: v-bind('`${radius}px`'); + background: $frontColor; + font-size: v-bind('`${width * 1.1}px`'); + color: v-bind('props.frontColor'); + box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); + text-align: center; + font-family: 'Helvetica Neue'; + + .digital:before, + .digital:after { + content: ''; + position: absolute; + left: 0; + right: 0; + background: v-bind('props.backColor'); + overflow: hidden; + box-sizing: border-box; + } + // .digital.front:after { + // content: v-bind(frontTextFromData) !important; + // } + // .digital.back:after { + // content: v-bind(backTextFromData) !important; + // } + .digital:before { + top: 0; + bottom: 50%; + border-radius: v-bind('`${radius}px`') v-bind('`${radius}px`') 0 0; + border-bottom: solid 1px #666; + } + .digital:after { + top: 50%; + bottom: 0; + border-radius: 0 0 v-bind('`${radius}px`') v-bind('`${radius}px`'); + line-height: 0; + } + /*向下翻*/ + &.down .front:before { + z-index: 3; + } + &.down .back:after { + z-index: 2; + transform-origin: 50% 0%; + transform: perspective(v-bind('`${height * 1.6}px`')) rotateX(180deg); + } + &.down .front:after, + &.down .back:before { + z-index: 1; + } + &.down.go .front:before { + transform-origin: 50% 100%; + animation: frontFlipDown v-bind('`${props.duration / 1000}s`') ease-in-out both; + box-shadow: 0 -2px 6px rgba(255, 255, 255, 0.3); + backface-visibility: hidden; + } + &.down.go .back:after { + animation: backFlipDown v-bind('`${props.duration / 1000}s`') ease-in-out both; + } + /*向上翻*/ + &.up .front:after { + z-index: 3; + } + &.up .back:before { + z-index: 2; + transform-origin: 50% 100%; + transform: perspective(v-bind('`${height * 1.6}px`')) rotateX(-180deg); + } + &.up .front:before, + &.up .back:after { + z-index: 1; + } + &.up.go .front:after { + transform-origin: 50% 0; + animation: frontFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; + box-shadow: 0 2px 6px rgba(255, 255, 255, 0.3); + backface-visibility: hidden; + } + &.up.go .back:before { + animation: backFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; + } + + .number0:before, + .number0:after { + content: '0'; + } + .number1:before, + .number1:after { + content: '1'; + } + .number2:before, + .number2:after { + content: '2'; + } + .number3:before, + .number3:after { + content: '3'; + } + .number4:before, + .number4:after { + content: '4'; + } + .number5:before, + .number5:after { + content: '5'; + } + .number6:before, + .number6:after { + content: '6'; + } + .number7:before, + .number7:after { + content: '7'; + } + .number8:before, + .number8:after { + content: '8'; + } + .number9:before, + .number9:after { + content: '9'; + } +} +</style> From 144ef06cd127e02ffbc9d7f013960c6de67d7161 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 10:34:29 +0800 Subject: [PATCH 16/56] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=84=E4=BB=B6(=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=B8=AD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Decorates/Mores/CountDown/config.ts | 38 +++++++++ .../Decorates/Mores/CountDown/config.vue | 68 ++++++++++++++++ .../Decorates/Mores/CountDown/index.ts | 14 ++++ .../Decorates/Mores/CountDown/index.vue | 77 +++++++++++++++++++ .../components/Decorates/Mores/index.ts | 3 +- 5 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 src/packages/components/Decorates/Mores/CountDown/config.ts create mode 100644 src/packages/components/Decorates/Mores/CountDown/config.vue create mode 100644 src/packages/components/Decorates/Mores/CountDown/index.ts create mode 100644 src/packages/components/Decorates/Mores/CountDown/index.vue diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts new file mode 100644 index 00000000..ee3c5193 --- /dev/null +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -0,0 +1,38 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { CountDownConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import { chartInitConfig } from '@/settings/designSetting' + +export enum FontWeightEnum { + NORMAL = '常规', + BOLD = '加粗' +} + +export const FontWeightObject = { + [FontWeightEnum.NORMAL]: 'normal', + [FontWeightEnum.BOLD]: 'bold' +} + +export const option = { + // 数据说明 + timeSize: 24, + timeLineHeight: 50, + timeTextIndent: 2, + timeColor: '#E6F7FF', + fontWeight: 'normal', + + //阴影 + showShadow: true, + hShadow: 0, + vShadow: 0, + blurShadow: 8, + colorShadow: '#0075ff' +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = CountDownConfig.key + public attr = { ...chartInitConfig, w: 300, h: 200, zIndex: -1 } + public chartConfig = cloneDeep(CountDownConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue new file mode 100644 index 00000000..208cbedb --- /dev/null +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -0,0 +1,68 @@ +<template> + <CollapseItem name="内容" :expanded="true"> + <SettingItemBox name="字体"> + <SettingItem name="大小"> + <n-input-number v-model:value="optionData.timeSize" size="small" :min="1"></n-input-number> + </SettingItem> + <SettingItem name="粗细"> + <n-select v-model:value="optionData.fontWeight" size="small" :options="fontWeightOptions" /> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="间距"> + <SettingItem name="字距"> + <n-input-number v-model:value="optionData.timeTextIndent" size="small" :min="1"></n-input-number> + </SettingItem> + <SettingItem name="行距"> + <n-input-number v-model:value="optionData.timeLineHeight" size="small" :min="1"></n-input-number> + </SettingItem> + </SettingItemBox> + + <SettingItemBox name="颜色"> + <SettingItem name="时间"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.timeColor"></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="阴影"> + <SettingItem> + <n-space> + <n-switch v-model:value="optionData.showShadow" size="small" /> + <n-text>展示阴影</n-text> + </n-space> + </SettingItem> + <SettingItem name="x"> + <n-input-number v-model:value="optionData.hShadow" size="small"></n-input-number + ></SettingItem> + <SettingItem name="y"> + <n-input-number v-model:value="optionData.vShadow" size="small"></n-input-number + ></SettingItem> + <SettingItem name="模糊"> + <n-input-number v-model:value="optionData.blurShadow" size="small"></n-input-number + ></SettingItem> + <SettingItem name="颜色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.colorShadow"></n-color-picker + ></SettingItem> + </SettingItemBox> + </CollapseItem> +</template> +<script setup lang="ts"> +import { PropType } from 'vue' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { option, FontWeightEnum, FontWeightObject } from './config' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) +const fontWeightOptions = [ + { + label: FontWeightEnum.NORMAL, + value: FontWeightObject[FontWeightEnum.NORMAL] + }, + { + label: FontWeightEnum.BOLD, + value: FontWeightObject[FontWeightEnum.BOLD] + } +] +</script> diff --git a/src/packages/components/Decorates/Mores/CountDown/index.ts b/src/packages/components/Decorates/Mores/CountDown/index.ts new file mode 100644 index 00000000..b745355c --- /dev/null +++ b/src/packages/components/Decorates/Mores/CountDown/index.ts @@ -0,0 +1,14 @@ +import image from '@/assets/images/chart/decorates/time.png' +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const CountDownConfig: ConfigType = { + key: 'CountDown', + chartKey: 'VCountDown', + conKey: 'VCCountDown', + title: '倒计时', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.DECORATES, + image +} diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue new file mode 100644 index 00000000..d151fe9a --- /dev/null +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -0,0 +1,77 @@ +<template> + <div class="go-decorates-more-countdown"> + <div>剩余时间</div> + <n-countdown :duration="50000" :active="true" /> + <flipper :front-text="9" ref="flipperRef" /> + <div>。</div> + </div> +</template> + +<script setup lang="ts"> +import { PropType, toRefs, ref, watch, onMounted, onUnmounted } from 'vue' +import { CreateComponentType } from '@/packages/index.d' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { useChartDataFetch } from '@/hooks' +import { Flipper } from '@/components/Flipper/index' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) +let boxShadow = ref('none') + +const { w, h } = toRefs(props.chartConfig.attr) + +let { + timeColor, + timeSize, + timeLineHeight, + timeTextIndent, + fontWeight, + showShadow, + hShadow, + vShadow, + blurShadow, + colorShadow +} = toRefs(props.chartConfig.option) + +watch( + props.chartConfig.option, + () => { + if (props.chartConfig.option.showShadow) { + boxShadow.value = `${props.chartConfig.option.hShadow}px ${props.chartConfig.option.vShadow}px ${props.chartConfig.option.blurShadow}px ${props.chartConfig.option.colorShadow}` + } else { + boxShadow.value = 'none' + } + }, + { + immediate: true + } +) + +const flipperRef = ref(null) + +let COUNT = 9 +let interval = 0 +onMounted(() => { + const interval = window.setInterval(() => { + COUNT-- + if (COUNT === 0) window.clearInterval(interval) + const flipperCON: any = flipperRef.value + flipperCON?.flipDown(COUNT, COUNT - 1) + }, 1000) +}) +onUnmounted(() => { + window.clearInterval(interval) +}) +useChartDataFetch(props.chartConfig, useChartEditStore) +</script> + +<style lang="scss" scoped> +@include go('decorates-more-countdown') { + width: v-bind('`${w}px`'); + height: v-bind('`${h}px`'); +} +</style> diff --git a/src/packages/components/Decorates/Mores/index.ts b/src/packages/components/Decorates/Mores/index.ts index 9aff3b7d..bc6a3849 100644 --- a/src/packages/components/Decorates/Mores/index.ts +++ b/src/packages/components/Decorates/Mores/index.ts @@ -1,5 +1,6 @@ import { NumberConfig } from './Number/index' import { TimeCommonConfig } from './TimeCommon/index' import { ClockConfig } from './Clock/index' +import { CountDownConfig } from './CountDown/index' -export default [TimeCommonConfig, NumberConfig, ClockConfig] +export default [TimeCommonConfig, CountDownConfig, NumberConfig, ClockConfig] From dad4d418941f4a1576b9173acbdd824017aed000 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: Thu, 29 Sep 2022 10:47:07 +0800 Subject: [PATCH 17/56] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=94=81?= =?UTF-8?q?=E5=AE=9A/=E9=9A=90=E8=97=8F=E5=BF=AB=E6=8D=B7=E9=94=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EditShortcutKey/ShortcutKeyModal.vue | 20 ++++++++++ src/views/chart/hooks/useContextMenu.hook.ts | 6 +-- src/views/chart/hooks/useKeyboard.hook.ts | 38 +++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue b/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue index 74a3574c..24af3ca7 100644 --- a/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue +++ b/src/views/chart/ContentEdit/components/EditShortcutKey/ShortcutKeyModal.vue @@ -63,6 +63,26 @@ const shortcutKeyOptions = [ win: `${WinKeyboard.CTRL.toUpperCase()} + ← `, mac: `${MacKeyboard.CTRL.toUpperCase()} + ← ` }, + { + label: '锁定', + win: `${WinKeyboard.CTRL.toUpperCase()} + L `, + mac: `${MacKeyboard.CTRL.toUpperCase()} + L ` + }, + { + label: '解锁', + win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()}+ L `, + mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + L ` + }, + { + label: '展示', + win: `${WinKeyboard.CTRL.toUpperCase()} + H `, + mac: `${MacKeyboard.CTRL.toUpperCase()} + H ` + }, + { + label: '隐藏', + win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + H `, + mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + H ` + }, { label: '删除', win: 'Delete'.toUpperCase(), diff --git a/src/views/chart/hooks/useContextMenu.hook.ts b/src/views/chart/hooks/useContextMenu.hook.ts index f79447cc..2bf8fdf8 100644 --- a/src/views/chart/hooks/useContextMenu.hook.ts +++ b/src/views/chart/hooks/useContextMenu.hook.ts @@ -44,7 +44,7 @@ export const defaultOptions: MenuOptionsItemType[] = [ fnHandle: chartEditStore.setLock }, { - label: '解除锁定', + label: '解锁', key: MenuEnum.UNLOCK, icon: renderIcon(LockOpenOutlineIcon), fnHandle: chartEditStore.setUnLock @@ -100,13 +100,13 @@ export const defaultOptions: MenuOptionsItemType[] = [ fnHandle: chartEditStore.setBottom }, { - label: '上移一层', + label: '上移', key: MenuEnum.UP, icon: renderIcon(ChevronUpIcon), fnHandle: chartEditStore.setUp }, { - label: '下移一层', + label: '下移', key: MenuEnum.DOWN, icon: renderIcon(ChevronDownIcon), fnHandle: chartEditStore.setDown diff --git a/src/views/chart/hooks/useKeyboard.hook.ts b/src/views/chart/hooks/useKeyboard.hook.ts index 19e219dd..a2ee49c0 100644 --- a/src/views/chart/hooks/useKeyboard.hook.ts +++ b/src/views/chart/hooks/useKeyboard.hook.ts @@ -24,6 +24,10 @@ export const winKeyboardValue = { [MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')), [MenuEnum.GROUP]: winCtrlMerge('g'), [MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')), + [MenuEnum.LOCK]: winCtrlMerge('l'), + [MenuEnum.UNLOCK]: winCtrlMerge(winShiftMerge('l')), + [MenuEnum.HIDE]: winCtrlMerge('h'), + [MenuEnum.SHOW]: winCtrlMerge(winShiftMerge('h')), } // 这个 Ctrl 后面还是换成了 ⌘ @@ -45,6 +49,10 @@ export const macKeyboardValue = { [MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')), [MenuEnum.GROUP]: macCtrlMerge('g'), [MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')), + [MenuEnum.LOCK]: macCtrlMerge('l'), + [MenuEnum.UNLOCK]: macCtrlMerge(macShiftMerge('l')), + [MenuEnum.HIDE]: macCtrlMerge('h'), + [MenuEnum.SHOW]: macCtrlMerge(macShiftMerge('h')), } // Win 快捷键列表 @@ -64,6 +72,12 @@ const winKeyList: Array<string> = [ winKeyboardValue.group, winKeyboardValue.unGroup, + + winKeyboardValue.lock, + winKeyboardValue.unLock, + + winKeyboardValue.hide, + winKeyboardValue.show, ] // Mac 快捷键列表 @@ -83,6 +97,12 @@ const macKeyList: Array<string> = [ macKeyboardValue.group, macKeyboardValue.unGroup, + + macKeyboardValue.lock, + macKeyboardValue.unLock, + + macKeyboardValue.hide, + macKeyboardValue.show, ] // 处理键盘记录 @@ -156,6 +176,24 @@ export const useAddKeyboard = () => { case keyboardValue.unGroup: keymaster(e, throttle(() => { chartEditStore.setUnGroup(); return false }, throttleTime)) break; + + // 锁定 ct+l + case keyboardValue.lock: + keymaster(e, throttle(() => { chartEditStore.setLock(); return false }, throttleTime)) + break; + // 解除锁定 ct+sh+l + case keyboardValue.unLock: + keymaster(e, throttle(() => { chartEditStore.setUnLock(); return false }, throttleTime)) + break; + + // 锁定 ct+h + case keyboardValue.hide: + keymaster(e, throttle(() => { chartEditStore.setHide(); return false }, throttleTime)) + break; + // 解除锁定 ct+sh+h + case keyboardValue.show: + keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime)) + break; } } winKeyList.forEach((key: string) => { From fd8aeba7005e16bed3dfd7cac93498b626b06862 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 11:35:35 +0800 Subject: [PATCH 18/56] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=8A=B6=E6=80=81=E4=B8=8B=E6=8E=A7=E5=88=B6=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../preview/components/PreviewRenderGroup/index.vue | 6 +++--- .../preview/components/PreviewRenderList/index.vue | 6 +++--- src/views/preview/utils/style.ts | 13 ++++++++++--- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/views/preview/components/PreviewRenderGroup/index.vue b/src/views/preview/components/PreviewRenderGroup/index.vue index 4d0a813e..62b9b22a 100644 --- a/src/views/preview/components/PreviewRenderGroup/index.vue +++ b/src/views/preview/components/PreviewRenderGroup/index.vue @@ -7,9 +7,9 @@ :style="{ ...getComponentAttrStyle(item.attr, groupIndex), ...getFilterStyle(item.styles), - ...getTransformStyle(item.styles) + ...getTransformStyle(item.styles), + ...getStatusStyle(item.status) }" - v-show="!item.status.hide" > <component :is="item.chartConfig.chartKey" @@ -25,7 +25,7 @@ import { PropType } from 'vue' import { CreateComponentGroupType } from '@/packages/index.d' import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' -import { getSizeStyle, getComponentAttrStyle } from '../../utils' +import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils' const props = defineProps({ groupData: { diff --git a/src/views/preview/components/PreviewRenderList/index.vue b/src/views/preview/components/PreviewRenderList/index.vue index a841315f..00e359ff 100644 --- a/src/views/preview/components/PreviewRenderList/index.vue +++ b/src/views/preview/components/PreviewRenderList/index.vue @@ -7,9 +7,9 @@ :style="{ ...getComponentAttrStyle(item.attr, index), ...getFilterStyle(item.styles), - ...getTransformStyle(item.styles) + ...getTransformStyle(item.styles), + ...getStatusStyle(item.status) }" - v-show="!item.status.hide" > <!-- 分组 --> <preview-render-group @@ -39,7 +39,7 @@ import { PreviewRenderGroup } from '../PreviewRenderGroup/index' import { CreateComponentGroupType } from '@/packages/index.d' import { chartColors } from '@/settings/chartThemes/index' import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' -import { getSizeStyle, getComponentAttrStyle } from '../../utils' +import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils' const props = defineProps({ localStorageInfo: { diff --git a/src/views/preview/utils/style.ts b/src/views/preview/utils/style.ts index 8392c348..6cd25cba 100644 --- a/src/views/preview/utils/style.ts +++ b/src/views/preview/utils/style.ts @@ -2,7 +2,7 @@ import { PickCreateComponentType } from '@/packages/index.d' import { EditCanvasConfigType } from '@/store/modules/chartEditStore/chartEditStore.d' type AttrType = PickCreateComponentType<'attr'> -type StylesType = PickCreateComponentType<'styles'> +type StatusType = PickCreateComponentType<'status'> // 设置位置 export const getComponentAttrStyle = (attr: AttrType, index: number) => { @@ -16,10 +16,17 @@ export const getComponentAttrStyle = (attr: AttrType, index: number) => { // 设置大小 export const getSizeStyle = (attr: AttrType, scale?: number) => { - return ({ + return { width: `${scale ? scale * attr.w : attr.w}px`, height: `${scale ? scale * attr.h : attr.h}px` - }) + } +} + +// 设置状态样式 +export const getStatusStyle = (attr: StatusType) => { + return { + display: attr.hide ? 'none' : 'block' + } } // 全局样式 From ac85b72be850d59cd64e659fc7cebbe28ec77b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E6=89=BF?= <1141845963@qq.com> Date: Thu, 29 Sep 2022 12:37:19 +0800 Subject: [PATCH 19/56] =?UTF-8?q?feat:=20=E4=B8=B0=E5=AF=8C=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Charts/Maps/MapBase/config.ts | 18 +++-- .../components/Charts/Maps/MapBase/config.vue | 70 +++++++++++++++++-- 2 files changed, 77 insertions(+), 11 deletions(-) diff --git a/src/packages/components/Charts/Maps/MapBase/config.ts b/src/packages/components/Charts/Maps/MapBase/config.ts index 455ca206..173ff409 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.ts +++ b/src/packages/components/Charts/Maps/MapBase/config.ts @@ -95,19 +95,23 @@ export const option = { geoIndex: 1, tooltip: { show: true, - backgroundColor: 'rgba(0,0,0,.6)', - borderColor: 'rgba(147, 235, 248, .8)', + backgroundColor: '#00000060', + borderColor: 'rgba(147, 235, 248, 0.8)', textStyle: { - color: '#FFF' + color: '#FFFFFF', + fontSize: 12, } }, label: { - show: false + show: false, + color: '#FFFFFF', + fontSize: 12, }, emphasis: { disabled: false, label: { - color: '#fffFFF' + color: '#FFFFFF', + fontSize: 12, }, itemStyle: { areaColor: '#389BB7', @@ -126,11 +130,11 @@ export const option = { colorStops: [ { offset: 0, - color: 'rgba(147, 235, 248, 0)' // 0% 处的颜色 + color: '#93ebf800' // 0% 处的颜色 }, { offset: 1, - color: 'rgba(147, 235, 248, .2)' // 100% 处的颜色 + color: '#93ebf820' // 100% 处的颜色 } ], globalCoord: false diff --git a/src/packages/components/Charts/Maps/MapBase/config.vue b/src/packages/components/Charts/Maps/MapBase/config.vue index c6d2958c..a6c916a2 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.vue +++ b/src/packages/components/Charts/Maps/MapBase/config.vue @@ -14,7 +14,7 @@ </SettingItem> </SettingItemBox> - <SettingItemBox name="区域颜色" :alone="true"> + <SettingItemBox name="区域颜色"> <SettingItem name="0%处颜色"> <n-color-picker size="small" @@ -61,7 +61,31 @@ ></n-input-number> </SettingItem> </SettingItemBox> - <SettingItemBox name="聚焦 (预览可见)"> + + <SettingItemBox name="省级名称"> + <setting-item name="显示"> + <n-space> + <n-switch v-model:value="seriesList[1].label.show" size="small"></n-switch> + </n-space> + </setting-item> + <SettingItem name="字体颜色"> + <n-color-picker + size="small" + :modes="['hex']" + v-model:value="seriesList[1].label.color" + ></n-color-picker> + </SettingItem> + <SettingItem name="字体大小"> + <n-input-number + v-model:value="seriesList[1].label.fontSize" + :min="1" + size="small" + placeholder="请输入字体大小" + ></n-input-number> + </SettingItem> + </SettingItemBox> + + <SettingItemBox name="悬浮 (预览可见)"> <setting-item name="禁用"> <n-space> <n-switch v-model:value="seriesList[1].emphasis.disabled" size="small"></n-switch> @@ -74,6 +98,14 @@ v-model:value="seriesList[1].emphasis.itemStyle.areaColor" ></n-color-picker> </SettingItem> + <SettingItem name="字体大小"> + <n-input-number + v-model:value="seriesList[1].emphasis.label.fontSize" + :min="1" + size="small" + placeholder="请输入字体大小" + ></n-input-number> + </SettingItem> <SettingItem name="阴影"> <n-color-picker size="small" @@ -97,7 +129,37 @@ ></n-color-picker> </SettingItem> </SettingItemBox> - <SettingItemBox name="边框"> + + <SettingItemBox name="悬浮弹窗"> + <SettingItem name="显示"> + <n-space> + <n-switch v-model:value="seriesList[1].tooltip.show" size="small"></n-switch> + </n-space> + </SettingItem> + <SettingItem name="字体大小"> + <n-input-number + v-model:value="seriesList[1].tooltip.textStyle.fontSize" + :min="1" + size="small" + placeholder="请输入字体大小" + ></n-input-number> + </SettingItem> + <SettingItem name="字体颜色"> + <n-color-picker + size="small" + :modes="['hex']" + v-model:value="seriesList[1].tooltip.textStyle.color" + ></n-color-picker> + </SettingItem> + <SettingItem name="背景颜色"> + <n-color-picker + size="small" + :modes="['hex']" + v-model:value="seriesList[1].tooltip.backgroundColor" + ></n-color-picker> + </SettingItem> + </SettingItemBox> + <SettingItemBox name="区域边框"> <SettingItem name="颜色"> <n-color-picker size="small" @@ -105,7 +167,7 @@ v-model:value="seriesList[1].itemStyle.borderColor" ></n-color-picker> </SettingItem> - <SettingItem name="大小"> + <SettingItem name="宽度大小"> <n-input-number v-model:value="seriesList[1].itemStyle.borderWidth" :min="1" From e3d5860a4179dd139fbae8fd642e005ba80a2653 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 15:20:23 +0800 Subject: [PATCH 20/56] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=E7=BF=BB?= =?UTF-8?q?=E7=89=8C=E5=99=A8=E6=A0=B7=E5=BC=8F=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.vue | 60 ++++++-------------------------- 1 file changed, 10 insertions(+), 50 deletions(-) diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index 8ccc7696..1e1d86de 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -1,7 +1,7 @@ <template> <div class="M-Flipper" :class="[flipType, { go: isFlipping }]"> - <div class="digital front" :class="_textClass(frontTextFromData)"></div> - <div class="digital back" :class="_textClass(backTextFromData)"></div> + <div class="digital front" :data-front="frontTextFromData"></div> + <div class="digital back" :data-back="backTextFromData"></div> </div> </template> @@ -51,7 +51,6 @@ const flipType = ref<FlipType>('down') const frontTextFromData = ref(props.frontText) const backTextFromData = ref(props.backText) -const _textClass = (number: string | number) => `number${number}` const _flip = (type: FlipType, front: string | number, back: string | number) => { // 如果处于翻转中,则不执行 if (isFlipping.value) return @@ -150,12 +149,14 @@ $radius: v-bind('props.radius'); overflow: hidden; box-sizing: border-box; } - // .digital.front:after { - // content: v-bind(frontTextFromData) !important; - // } - // .digital.back:after { - // content: v-bind(backTextFromData) !important; - // } + .digital.front:before, + .digital.front:after { + content: attr(data-front) !important; + } + .digital.back:before, + .digital.back:after { + content: attr(data-back) !important; + } .digital:before { top: 0; bottom: 50%; @@ -212,46 +213,5 @@ $radius: v-bind('props.radius'); &.up.go .back:before { animation: backFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; } - - .number0:before, - .number0:after { - content: '0'; - } - .number1:before, - .number1:after { - content: '1'; - } - .number2:before, - .number2:after { - content: '2'; - } - .number3:before, - .number3:after { - content: '3'; - } - .number4:before, - .number4:after { - content: '4'; - } - .number5:before, - .number5:after { - content: '5'; - } - .number6:before, - .number6:after { - content: '6'; - } - .number7:before, - .number7:after { - content: '7'; - } - .number8:before, - .number8:after { - content: '8'; - } - .number9:before, - .number9:after { - content: '9'; - } } </style> From d0260041ce2adc1faeb8f9731bd55b1eb03cd069 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 15:21:04 +0800 Subject: [PATCH 21/56] =?UTF-8?q?fix:=20=E5=BC=95=E5=85=A5=20naiveui=20NCo?= =?UTF-8?q?untdown=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/naive.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/naive.ts b/src/plugins/naive.ts index a1e03c3a..9354a285 100644 --- a/src/plugins/naive.ts +++ b/src/plugins/naive.ts @@ -1,4 +1,4 @@ -import type { App } from 'vue'; +import type { App } from 'vue' import { create, NA, @@ -8,6 +8,7 @@ import { NH3, NH4, NCode, + NCountdown, NText, NTime, NEllipsis, @@ -98,7 +99,7 @@ import { NWatermark, NEmpty, NCollapseTransition -} from 'naive-ui'; +} from 'naive-ui' const naive = create({ components: [ @@ -109,6 +110,7 @@ const naive = create({ NH3, NH4, NCode, + NCountdown, NText, NTime, NEllipsis, @@ -199,9 +201,9 @@ const naive = create({ NWatermark, NEmpty, NCollapseTransition - ], -}); + ] +}) export function setupNaive(app: App<Element>) { - app.use(naive); + app.use(naive) } From 4a75cc4d1108af443fe99c2fef213cbc3ec2d3a1 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 15:21:22 +0800 Subject: [PATCH 22/56] =?UTF-8?q?chore:=20=E8=B0=83=E6=95=B4=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Decorates/Mores/CountDown/config.ts | 21 ++--- .../Decorates/Mores/CountDown/config.vue | 85 +++++++---------- .../Decorates/Mores/CountDown/index.vue | 91 +++++++++++++++---- 3 files changed, 113 insertions(+), 84 deletions(-) diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index ee3c5193..118797ff 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -15,24 +15,17 @@ export const FontWeightObject = { } export const option = { - // 数据说明 - timeSize: 24, - timeLineHeight: 50, - timeTextIndent: 2, - timeColor: '#E6F7FF', - fontWeight: 'normal', - - //阴影 - showShadow: true, - hShadow: 0, - vShadow: 0, - blurShadow: 8, - colorShadow: '#0075ff' + flipperBgColor: '#ee6600FF', + flipperTextColor: '#336600FF', + flipperWidth: 60, + flipperHeight: 100, + flipperRadius: 10, + flipperSpeed: 600 } export default class Config extends PublicConfigClass implements CreateComponentType { public key = CountDownConfig.key - public attr = { ...chartInitConfig, w: 300, h: 200, zIndex: -1 } + public attr = { ...chartInitConfig, w: 500, h: 200, zIndex: -1 } public chartConfig = cloneDeep(CountDownConfig) public option = cloneDeep(option) } diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index 208cbedb..bd8efe1c 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -1,53 +1,40 @@ <template> - <CollapseItem name="内容" :expanded="true"> - <SettingItemBox name="字体"> - <SettingItem name="大小"> - <n-input-number v-model:value="optionData.timeSize" size="small" :min="1"></n-input-number> - </SettingItem> - <SettingItem name="粗细"> - <n-select v-model:value="optionData.fontWeight" size="small" :options="fontWeightOptions" /> - </SettingItem> - </SettingItemBox> - <SettingItemBox name="间距"> - <SettingItem name="字距"> - <n-input-number v-model:value="optionData.timeTextIndent" size="small" :min="1"></n-input-number> - </SettingItem> - <SettingItem name="行距"> - <n-input-number v-model:value="optionData.timeLineHeight" size="small" :min="1"></n-input-number> - </SettingItem> - </SettingItemBox> + <collapse-item name="翻牌" :expanded="true"> + <setting-item-box name="尺寸"> + <setting-item name="宽度"> + <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> + </setting-item> + <setting-item name="高度"> + <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number> + </setting-item> + </setting-item-box> - <SettingItemBox name="颜色"> - <SettingItem name="时间"> - <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.timeColor"></n-color-picker> - </SettingItem> - </SettingItemBox> - <SettingItemBox name="阴影"> - <SettingItem> - <n-space> - <n-switch v-model:value="optionData.showShadow" size="small" /> - <n-text>展示阴影</n-text> - </n-space> - </SettingItem> - <SettingItem name="x"> - <n-input-number v-model:value="optionData.hShadow" size="small"></n-input-number - ></SettingItem> - <SettingItem name="y"> - <n-input-number v-model:value="optionData.vShadow" size="small"></n-input-number - ></SettingItem> - <SettingItem name="模糊"> - <n-input-number v-model:value="optionData.blurShadow" size="small"></n-input-number - ></SettingItem> - <SettingItem name="颜色"> - <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.colorShadow"></n-color-picker - ></SettingItem> - </SettingItemBox> - </CollapseItem> + <setting-item-box name="样式"> + <setting-item name="背景色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperBgColor"></n-color-picker> + </setting-item> + <setting-item name="字体色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker> + </setting-item> + <setting-item name="圆角"> + <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="翻牌速度"> + <n-input-number + v-model:value="optionData.flipperSpeed" + size="small" + :min="100" + :max="900" + :step="100" + ></n-input-number> + </setting-item> + </setting-item-box> + </collapse-item> </template> <script setup lang="ts"> import { PropType } from 'vue' import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' -import { option, FontWeightEnum, FontWeightObject } from './config' +import { option } from './config' const props = defineProps({ optionData: { @@ -55,14 +42,4 @@ const props = defineProps({ required: true } }) -const fontWeightOptions = [ - { - label: FontWeightEnum.NORMAL, - value: FontWeightObject[FontWeightEnum.NORMAL] - }, - { - label: FontWeightEnum.BOLD, - value: FontWeightObject[FontWeightEnum.BOLD] - } -] </script> diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index d151fe9a..3a7d0b04 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -1,9 +1,73 @@ <template> <div class="go-decorates-more-countdown"> - <div>剩余时间</div> <n-countdown :duration="50000" :active="true" /> - <flipper :front-text="9" ref="flipperRef" /> - <div>。</div> + <n-space :gap="10"> + <flipper + :front-text="9" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef" + /> + <flipper + :front-text="9" + :back-text="8" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef2" + /> + <flipper + :front-text="8" + :back-text="7" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef3" + /> + <flipper + :front-text="7" + :back-text="7" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef4" + /> + <flipper + :front-text="6" + :back-text="5" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef5" + /> + <flipper + :front-text="5" + :back-text="4" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :duration="flipperSpeed" + ref="flipperRef6" + /> + </n-space> </div> </template> @@ -24,18 +88,9 @@ let boxShadow = ref('none') const { w, h } = toRefs(props.chartConfig.attr) -let { - timeColor, - timeSize, - timeLineHeight, - timeTextIndent, - fontWeight, - showShadow, - hShadow, - vShadow, - blurShadow, - colorShadow -} = toRefs(props.chartConfig.option) +let { flipperBgColor, flipperTextColor, flipperWidth, flipperHeight, flipperRadius, flipperSpeed } = toRefs( + props.chartConfig.option +) watch( props.chartConfig.option, @@ -58,7 +113,7 @@ let interval = 0 onMounted(() => { const interval = window.setInterval(() => { COUNT-- - if (COUNT === 0) window.clearInterval(interval) + if (COUNT <= 1) window.clearInterval(interval) const flipperCON: any = flipperRef.value flipperCON?.flipDown(COUNT, COUNT - 1) }, 1000) @@ -73,5 +128,9 @@ useChartDataFetch(props.chartConfig, useChartEditStore) @include go('decorates-more-countdown') { width: v-bind('`${w}px`'); height: v-bind('`${h}px`'); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; } </style> From 01bf37ce388d752feadc31ce51224ae1122827f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E6=89=BF?= <1141845963@qq.com> Date: Thu, 29 Sep 2022 15:23:32 +0800 Subject: [PATCH 23/56] =?UTF-8?q?feat:=20=E4=B8=B0=E5=AF=8C=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Charts/Maps/MapBase/config.ts | 2 +- .../components/Charts/Maps/MapBase/config.vue | 24 +++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/packages/components/Charts/Maps/MapBase/config.ts b/src/packages/components/Charts/Maps/MapBase/config.ts index 173ff409..36663256 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.ts +++ b/src/packages/components/Charts/Maps/MapBase/config.ts @@ -73,7 +73,7 @@ export const option = { textShadowColor: '#000', textShadowBlur: 10, textBorderWidth: 0, - color: '#FFF', + color: '#FFFFFF', show: true }, itemStyle: { diff --git a/src/packages/components/Charts/Maps/MapBase/config.vue b/src/packages/components/Charts/Maps/MapBase/config.vue index a6c916a2..b3ef4961 100644 --- a/src/packages/components/Charts/Maps/MapBase/config.vue +++ b/src/packages/components/Charts/Maps/MapBase/config.vue @@ -62,12 +62,12 @@ </SettingItem> </SettingItemBox> - <SettingItemBox name="省级名称"> - <setting-item name="显示"> + <SettingItemBox name="地理信息名称"> + <SettingItem name="显示"> <n-space> <n-switch v-model:value="seriesList[1].label.show" size="small"></n-switch> </n-space> - </setting-item> + </SettingItem> <SettingItem name="字体颜色"> <n-color-picker size="small" @@ -86,11 +86,11 @@ </SettingItemBox> <SettingItemBox name="悬浮 (预览可见)"> - <setting-item name="禁用"> + <SettingItem name="禁用"> <n-space> <n-switch v-model:value="seriesList[1].emphasis.disabled" size="small"></n-switch> </n-space> - </setting-item> + </SettingItem> <SettingItem name="颜色"> <n-color-picker size="small" @@ -191,6 +191,20 @@ <n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[0].itemStyle.color"></n-color-picker> </SettingItem> </SettingItemBox> + + <SettingItemBox name="文本"> + <SettingItem name="显示"> + <n-space> + <n-switch v-model:value="seriesList[0].label.show" size="small"></n-switch> + </n-space> + </SettingItem> + <SettingItem name="字体大小"> + <n-input-number v-model:value="seriesList[0].label.fontSize" size="small" :min="0"></n-input-number> + </SettingItem> + <SettingItem name="字体颜色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[0].label.color"></n-color-picker> + </SettingItem> + </SettingItemBox> <SettingItemBox name="涟漪"> <SettingItem name="涟漪大小"> From a56ddc9415d285b5f975a6b7d76c7e575f2ef3f5 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 19:11:54 +0800 Subject: [PATCH 24/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E7=BF=BB?= =?UTF-8?q?=E7=89=8C=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.vue | 114 +++++++++++++++++-------------- 1 file changed, 61 insertions(+), 53 deletions(-) diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index 1e1d86de..63f5b55f 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -1,24 +1,28 @@ <template> <div class="M-Flipper" :class="[flipType, { go: isFlipping }]"> - <div class="digital front" :data-front="frontTextFromData"></div> - <div class="digital back" :data-back="backTextFromData"></div> + <div class="digital front" :data-front="frontTextFromData || 0"></div> + <div class="digital back" :data-back="backTextFromData || 0"></div> </div> </template> <script lang="ts" setup> -import { ref } from 'vue' +import { ref, PropType, watch } from 'vue' type FlipType = 'up' | 'down' -const name = 'Flipper' - const props = defineProps({ + flipType: { + type: Object as PropType<FlipType>, + default: () => { + return 'down' + } + }, frontText: { type: [Number, String], default: 0 }, backText: { type: [Number, String], - default: 1 + default: 0 }, duration: { type: Number, @@ -47,97 +51,101 @@ const props = defineProps({ }) const isFlipping = ref(false) -const flipType = ref<FlipType>('down') const frontTextFromData = ref(props.frontText) const backTextFromData = ref(props.backText) -const _flip = (type: FlipType, front: string | number, back: string | number) => { +// 翻牌 +const flip = (front: string | number, back: string | number) => { // 如果处于翻转中,则不执行 if (isFlipping.value) return - frontTextFromData.value = front + // 设置翻盘前后数据 backTextFromData.value = back - // 根据传递过来的type设置翻转方向 - flipType.value = type + frontTextFromData.value = front + // 设置翻转状态为true isFlipping.value = true + + // 翻牌结束的行为 setTimeout(() => { - // 设置翻转状态为false - isFlipping.value = false + isFlipping.value = false // 设置翻转状态为false frontTextFromData.value = back }, props.duration) } -// 下翻牌 -const flipDown = (front: string | number, back: string | number) => _flip('down', front, back) -// 上翻牌 -const flipUp = (front: string | number, back: string | number) => _flip('up', front, back) -// 设置前牌文字 -const setFront = (text: string | number) => { - frontTextFromData.value = text -} -// 设置后牌文字 -const setBack = (text: string | number) => { - backTextFromData.value = text -} + +watch( + () => props.backText, + (newVal, oldVal) => { + console.log('watch:props.backText', newVal) + flip(newVal, oldVal as string | number) + }, + { + immediate: true + } +) defineExpose({ - name, - flipDown, - flipUp + flip }) </script> <style lang="scss" scoped> +// #region 动画效果 @keyframes frontFlipDown { 0% { - transform: perspective(160px) rotateX(0deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); } 100% { - transform: perspective(160px) rotateX(-180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); } } @keyframes backFlipDown { 0% { - transform: perspective(160px) rotateX(180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); } 100% { - transform: perspective(160px) rotateX(0deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); } } @keyframes frontFlipUp { 0% { - transform: perspective(160px) rotateX(0deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); } 100% { - transform: perspective(160px) rotateX(180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); } } @keyframes backFlipUp { 0% { - transform: perspective(160px) rotateX(-180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); } 100% { - transform: perspective(160px) rotateX(0deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); } } +// #endregion $frontColor: v-bind('props.frontColor'); $backColor: v-bind('props.backColor'); -$radius: v-bind('props.radius'); +$radius: v-bind('`${props.radius}px`'); +$width: v-bind('`${props.width}px`'); +$height: v-bind('`${props.height}px`'); +$shadowColor: #000000; +$lineColor: #ffffff; .M-Flipper { display: inline-block; position: relative; - width: v-bind('`${width}px`'); - height: v-bind('`${height}px`'); - line-height: v-bind('`${height}px`'); + width: $width; + height: $height; + line-height: $height; border: solid 1px $backColor; - border-radius: v-bind('`${radius}px`'); + border-radius: $radius; background: $frontColor; - font-size: v-bind('`${width * 1.1}px`'); - color: v-bind('props.frontColor'); - box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); + font-size: v-bind('`${props.width * 1.1}px`'); + color: $frontColor; + box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分 text-align: center; - font-family: 'Helvetica Neue'; + // font-family: 'Helvetica Neue'; .digital:before, .digital:after { @@ -145,7 +153,7 @@ $radius: v-bind('props.radius'); position: absolute; left: 0; right: 0; - background: v-bind('props.backColor'); + background: $backColor; overflow: hidden; box-sizing: border-box; } @@ -160,13 +168,13 @@ $radius: v-bind('props.radius'); .digital:before { top: 0; bottom: 50%; - border-radius: v-bind('`${radius}px`') v-bind('`${radius}px`') 0 0; - border-bottom: solid 1px #666; + border-radius: $radius $radius 0 0; + border-bottom: solid 1px rgba($color: $lineColor, $alpha: 0.5); // 中间线颜色 } .digital:after { top: 50%; bottom: 0; - border-radius: 0 0 v-bind('`${radius}px`') v-bind('`${radius}px`'); + border-radius: 0 0 $radius $radius; line-height: 0; } /*向下翻*/ @@ -176,7 +184,7 @@ $radius: v-bind('props.radius'); &.down .back:after { z-index: 2; transform-origin: 50% 0%; - transform: perspective(v-bind('`${height * 1.6}px`')) rotateX(180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); } &.down .front:after, &.down .back:before { @@ -185,7 +193,7 @@ $radius: v-bind('props.radius'); &.down.go .front:before { transform-origin: 50% 100%; animation: frontFlipDown v-bind('`${props.duration / 1000}s`') ease-in-out both; - box-shadow: 0 -2px 6px rgba(255, 255, 255, 0.3); + box-shadow: 0 -2px 6px rgba($color: $lineColor, $alpha: 0.3); backface-visibility: hidden; } &.down.go .back:after { @@ -198,7 +206,7 @@ $radius: v-bind('props.radius'); &.up .back:before { z-index: 2; transform-origin: 50% 100%; - transform: perspective(v-bind('`${height * 1.6}px`')) rotateX(-180deg); + transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); } &.up .front:before, &.up .back:after { @@ -207,7 +215,7 @@ $radius: v-bind('props.radius'); &.up.go .front:after { transform-origin: 50% 0; animation: frontFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; - box-shadow: 0 2px 6px rgba(255, 255, 255, 0.3); + box-shadow: 0 2px 6px rgba($color: $lineColor, $alpha: 0.3); backface-visibility: hidden; } &.up.go .back:before { From 73ce3a855135782a33a26bbcac1c2c509f9d7a75 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Thu, 29 Sep 2022 19:25:29 +0800 Subject: [PATCH 25/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.vue | 2 + .../Decorates/Mores/CountDown/config.ts | 2 +- .../Decorates/Mores/CountDown/index.vue | 68 +++---------------- 3 files changed, 13 insertions(+), 59 deletions(-) diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index 63f5b55f..fcee3cdd 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -56,6 +56,8 @@ const backTextFromData = ref(props.backText) // 翻牌 const flip = (front: string | number, back: string | number) => { + if (!back) back = +front - 1 + console.log('flip:', { front, back }) // 如果处于翻转中,则不执行 if (isFlipping.value) return // 设置翻盘前后数据 diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index 118797ff..94b2e383 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -16,7 +16,7 @@ export const FontWeightObject = { export const option = { flipperBgColor: '#ee6600FF', - flipperTextColor: '#336600FF', + flipperTextColor: '#FFFFFFFF', flipperWidth: 60, flipperHeight: 100, flipperRadius: 10, diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index 3a7d0b04..e98c5bf4 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -3,7 +3,9 @@ <n-countdown :duration="50000" :active="true" /> <n-space :gap="10"> <flipper - :front-text="9" + flip-type="down" + :front-text="0" + :back-text="COUNT" :width="flipperWidth" :height="flipperHeight" :front-color="flipperTextColor" @@ -12,61 +14,6 @@ :duration="flipperSpeed" ref="flipperRef" /> - <flipper - :front-text="9" - :back-text="8" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - ref="flipperRef2" - /> - <flipper - :front-text="8" - :back-text="7" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - ref="flipperRef3" - /> - <flipper - :front-text="7" - :back-text="7" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - ref="flipperRef4" - /> - <flipper - :front-text="6" - :back-text="5" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - ref="flipperRef5" - /> - <flipper - :front-text="5" - :back-text="4" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - ref="flipperRef6" - /> </n-space> </div> </template> @@ -112,10 +59,15 @@ let COUNT = 9 let interval = 0 onMounted(() => { const interval = window.setInterval(() => { + if (COUNT <= 1) { + window.clearInterval(interval) + return + } COUNT-- - if (COUNT <= 1) window.clearInterval(interval) const flipperCON: any = flipperRef.value - flipperCON?.flipDown(COUNT, COUNT - 1) + console.log(flipperCON) + flipperCON?.flip(COUNT, COUNT - 1) + console.log('onMounted:window.setInterval', COUNT) }, 1000) }) onUnmounted(() => { From 77a763db75c1217bb90b30f1f5254f65ca480de0 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Fri, 30 Sep 2022 01:29:48 +0800 Subject: [PATCH 26/56] =?UTF-8?q?chore:=20=E5=9F=BA=E6=9C=AC=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=BF=BB=E7=89=8C=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.vue | 35 ++++------ .../Decorates/Mores/CountDown/config.ts | 4 +- .../Decorates/Mores/CountDown/config.vue | 9 +++ .../Decorates/Mores/CountDown/index.vue | 69 +++++++++---------- 4 files changed, 60 insertions(+), 57 deletions(-) diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index fcee3cdd..b71a08a1 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -1,26 +1,28 @@ <template> <div class="M-Flipper" :class="[flipType, { go: isFlipping }]"> - <div class="digital front" :data-front="frontTextFromData || 0"></div> - <div class="digital back" :data-back="backTextFromData || 0"></div> + <div class="digital front" :data-front="frontTextFromData"></div> + <div class="digital back" :data-back="backTextFromData"></div> </div> </template> +<script lang="ts"> +export default { + name: 'Flipper' +} +</script> + <script lang="ts" setup> import { ref, PropType, watch } from 'vue' type FlipType = 'up' | 'down' const props = defineProps({ flipType: { - type: Object as PropType<FlipType>, + type: String as PropType<FlipType>, default: () => { return 'down' } }, - frontText: { - type: [Number, String], - default: 0 - }, - backText: { + count: { type: [Number, String], default: 0 }, @@ -51,13 +53,11 @@ const props = defineProps({ }) const isFlipping = ref(false) -const frontTextFromData = ref(props.frontText) -const backTextFromData = ref(props.backText) +const frontTextFromData = ref(props.count || 0) +const backTextFromData = ref(props.count || 0) // 翻牌 const flip = (front: string | number, back: string | number) => { - if (!back) back = +front - 1 - console.log('flip:', { front, back }) // 如果处于翻转中,则不执行 if (isFlipping.value) return // 设置翻盘前后数据 @@ -75,19 +75,14 @@ const flip = (front: string | number, back: string | number) => { } watch( - () => props.backText, + () => props.count, (newVal, oldVal) => { - console.log('watch:props.backText', newVal) - flip(newVal, oldVal as string | number) + flip(oldVal as string | number, newVal as string | number) }, { immediate: true } ) - -defineExpose({ - flip -}) </script> <style lang="scss" scoped> @@ -171,7 +166,7 @@ $lineColor: #ffffff; top: 0; bottom: 50%; border-radius: $radius $radius 0 0; - border-bottom: solid 1px rgba($color: $lineColor, $alpha: 0.5); // 中间线颜色 + border-bottom: solid 1px rgba($color: $lineColor, $alpha: 0.3); // 中间线颜色 } .digital:after { top: 50%; diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index 94b2e383..f7904e4b 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -15,12 +15,14 @@ export const FontWeightObject = { } export const option = { + dataset: 203234, + flipperLength: 6, flipperBgColor: '#ee6600FF', flipperTextColor: '#FFFFFFFF', flipperWidth: 60, flipperHeight: 100, flipperRadius: 10, - flipperSpeed: 600 + flipperSpeed: 450 } export default class Config extends PublicConfigClass implements CreateComponentType { diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index bd8efe1c..5ae92508 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -1,5 +1,14 @@ <template> <collapse-item name="翻牌" :expanded="true"> + <setting-item-box name="内容"> + <setting-item name="初始值"> + <n-input-number v-model:value="optionData.dataset" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="个数"> + <n-input-number v-model:value="optionData.flipperLength" size="small" :min="1"></n-input-number> + </setting-item> + </setting-item-box> + <setting-item-box name="尺寸"> <setting-item name="宽度"> <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index e98c5bf4..415bb3bf 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -1,25 +1,25 @@ <template> <div class="go-decorates-more-countdown"> - <n-countdown :duration="50000" :active="true" /> + <!-- <n-countdown :duration="50000" :active="true" /> --> <n-space :gap="10"> <flipper flip-type="down" - :front-text="0" - :back-text="COUNT" + :count="item" :width="flipperWidth" :height="flipperHeight" :front-color="flipperTextColor" :back-color="flipperBgColor" :radius="flipperRadius" :duration="flipperSpeed" - ref="flipperRef" + v-for="(item, index) in flipperData" + :key="index" /> </n-space> </div> </template> <script setup lang="ts"> -import { PropType, toRefs, ref, watch, onMounted, onUnmounted } from 'vue' +import { PropType, toRefs, watch, computed } from 'vue' import { CreateComponentType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartDataFetch } from '@/hooks' @@ -31,49 +31,47 @@ const props = defineProps({ required: true } }) -let boxShadow = ref('none') const { w, h } = toRefs(props.chartConfig.attr) -let { flipperBgColor, flipperTextColor, flipperWidth, flipperHeight, flipperRadius, flipperSpeed } = toRefs( - props.chartConfig.option -) +const { + dataset, + flipperLength, + flipperBgColor, + flipperTextColor, + flipperWidth, + flipperHeight, + flipperRadius, + flipperSpeed +} = toRefs(props.chartConfig.option) + +const updateDatasetHandler = (newVal: number) => { + let datasetVal = dataset?.value as Number + datasetVal !== undefined && (datasetVal = newVal) +} watch( - props.chartConfig.option, - () => { - if (props.chartConfig.option.showShadow) { - boxShadow.value = `${props.chartConfig.option.hShadow}px ${props.chartConfig.option.vShadow}px ${props.chartConfig.option.blurShadow}px ${props.chartConfig.option.colorShadow}` - } else { - boxShadow.value = 'none' - } + props.chartConfig.option.dataset, + (newVal: number) => { + updateDatasetHandler(newVal) }, { immediate: true } ) -const flipperRef = ref(null) +const flipperData = computed(() => { + const datasetVal: Number = dataset?.value || 0 + return datasetVal + .toString() + .padStart(flipperLength.value, '0') + .split('') + .slice(flipperLength.value * -1) +}) -let COUNT = 9 -let interval = 0 -onMounted(() => { - const interval = window.setInterval(() => { - if (COUNT <= 1) { - window.clearInterval(interval) - return - } - COUNT-- - const flipperCON: any = flipperRef.value - console.log(flipperCON) - flipperCON?.flip(COUNT, COUNT - 1) - console.log('onMounted:window.setInterval', COUNT) - }, 1000) +useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: number) => { + updateDatasetHandler(newVal) }) -onUnmounted(() => { - window.clearInterval(interval) -}) -useChartDataFetch(props.chartConfig, useChartEditStore) </script> <style lang="scss" scoped> @@ -81,7 +79,6 @@ useChartDataFetch(props.chartConfig, useChartEditStore) width: v-bind('`${w}px`'); height: v-bind('`${h}px`'); display: flex; - flex-direction: column; align-items: center; justify-content: center; } From 872382b4a3d434f298e821887bad1364831df076 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Fri, 30 Sep 2022 09:22:56 +0800 Subject: [PATCH 27/56] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=95=B0?= =?UTF-8?q?=E5=AD=97=E7=BF=BB=E7=89=8C=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Flipper/index.ts | 3 +- src/components/Flipper/index.vue | 2 +- .../Decorates/Mores/CountDown/config.ts | 26 +++--- .../Decorates/Mores/CountDown/config.vue | 38 ++++++--- .../Decorates/Mores/CountDown/index.vue | 78 +++++++++--------- .../Decorates/Mores/FlipperNumber/config.ts | 39 +++++++++ .../Decorates/Mores/FlipperNumber/config.vue | 72 +++++++++++++++++ .../Decorates/Mores/FlipperNumber/index.ts | 14 ++++ .../Decorates/Mores/FlipperNumber/index.vue | 81 +++++++++++++++++++ .../components/Decorates/Mores/index.ts | 3 +- 10 files changed, 292 insertions(+), 64 deletions(-) create mode 100644 src/packages/components/Decorates/Mores/FlipperNumber/config.ts create mode 100644 src/packages/components/Decorates/Mores/FlipperNumber/config.vue create mode 100644 src/packages/components/Decorates/Mores/FlipperNumber/index.ts create mode 100644 src/packages/components/Decorates/Mores/FlipperNumber/index.vue diff --git a/src/components/Flipper/index.ts b/src/components/Flipper/index.ts index bf785165..fc3da216 100644 --- a/src/components/Flipper/index.ts +++ b/src/components/Flipper/index.ts @@ -1,3 +1,4 @@ import Flipper from './index.vue' +type FlipType = 'up' | 'down' -export { Flipper } +export { Flipper, FlipType } diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index b71a08a1..72807c5e 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -13,7 +13,7 @@ export default { <script lang="ts" setup> import { ref, PropType, watch } from 'vue' -type FlipType = 'up' | 'down' +import { FlipType } from '.' const props = defineProps({ flipType: { diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index f7904e4b..5440a13a 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -3,25 +3,31 @@ import { CreateComponentType } from '@/packages/index.d' import { CountDownConfig } from './index' import cloneDeep from 'lodash/cloneDeep' import { chartInitConfig } from '@/settings/designSetting' +import { FlipType } from '@/components/Flipper' -export enum FontWeightEnum { - NORMAL = '常规', - BOLD = '加粗' +export interface OptionType { + dataset: number | string + flipperLength: number + flipperBgColor: string + flipperTextColor: string + flipperWidth: number + flipperHeight: number + flipperRadius: number + flipperGap: number + flipperType: FlipType + flipperSpeed: number } -export const FontWeightObject = { - [FontWeightEnum.NORMAL]: 'normal', - [FontWeightEnum.BOLD]: 'bold' -} - -export const option = { +export const option: OptionType = { dataset: 203234, flipperLength: 6, - flipperBgColor: '#ee6600FF', + flipperBgColor: '#ee6600', flipperTextColor: '#FFFFFFFF', flipperWidth: 60, flipperHeight: 100, flipperRadius: 10, + flipperGap: 10, + flipperType: 'down', flipperSpeed: 450 } diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index 5ae92508..a7478250 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -9,24 +9,42 @@ </setting-item> </setting-item-box> - <setting-item-box name="尺寸"> + <setting-item-box name="样式"> <setting-item name="宽度"> <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> </setting-item> <setting-item name="高度"> <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number> </setting-item> - </setting-item-box> - - <setting-item-box name="样式"> + <setting-item name="间隔"> + <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="圆角"> + <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> + </setting-item> <setting-item name="背景色"> - <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperBgColor"></n-color-picker> + <n-color-picker + size="small" + :show-alpha="false" + :modes="['hex']" + v-model:value="optionData.flipperBgColor" + ></n-color-picker> </setting-item> <setting-item name="字体色"> <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker> </setting-item> - <setting-item name="圆角"> - <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> + </setting-item-box> + + <setting-item-box name="行为"> + <setting-item name="动画"> + <n-select + v-model:value="optionData.flipperType" + size="small" + :options="[ + { label: '下翻', value: 'down' }, + { label: '上翻', value: 'up' } + ]" + ></n-select> </setting-item> <setting-item name="翻牌速度"> <n-input-number @@ -43,11 +61,11 @@ <script setup lang="ts"> import { PropType } from 'vue' import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' -import { option } from './config' +import { OptionType } from './config' -const props = defineProps({ +defineProps({ optionData: { - type: Object as PropType<typeof option>, + type: Object as PropType<OptionType>, required: true } }) diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index 415bb3bf..34a6defa 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -1,29 +1,28 @@ <template> - <div class="go-decorates-more-countdown"> - <!-- <n-countdown :duration="50000" :active="true" /> --> - <n-space :gap="10"> - <flipper - flip-type="down" - :count="item" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :duration="flipperSpeed" - v-for="(item, index) in flipperData" - :key="index" - /> - </n-space> - </div> + <!-- <n-countdown :duration="50000" :active="true" /> --> + <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in flipperData" + :key="index" + /> + </n-space> </template> <script setup lang="ts"> -import { PropType, toRefs, watch, computed } from 'vue' +import { PropType, toRefs, watch, ref } from 'vue' import { CreateComponentType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartDataFetch } from '@/hooks' -import { Flipper } from '@/components/Flipper/index' +import { Flipper } from '@/components/Flipper' +import { OptionType } from './config' const props = defineProps({ chartConfig: { @@ -35,41 +34,41 @@ const props = defineProps({ const { w, h } = toRefs(props.chartConfig.attr) const { - dataset, flipperLength, flipperBgColor, flipperTextColor, flipperWidth, flipperHeight, flipperRadius, + flipperGap, + flipperType, flipperSpeed -} = toRefs(props.chartConfig.option) +} = toRefs(props.chartConfig.option as OptionType) -const updateDatasetHandler = (newVal: number) => { - let datasetVal = dataset?.value as Number - datasetVal !== undefined && (datasetVal = newVal) +const flipperData = ref<string[] | number[]>([]) +const getFlipperData = (val: string | number) => { + return val + .toString() + .padStart(flipperLength.value, '0') // 左侧填充|右对齐 + .split('') // 转数组 + .slice(flipperLength.value * -1) // 从右向左取 +} +const updateDatasetHandler = (newVal: string | number) => { + flipperData.value = getFlipperData(newVal) } watch( - props.chartConfig.option.dataset, - (newVal: number) => { - updateDatasetHandler(newVal) + () => props.chartConfig.option, + newVal => { + updateDatasetHandler((newVal as OptionType).dataset) }, { - immediate: true + immediate: true, + deep: true } ) -const flipperData = computed(() => { - const datasetVal: Number = dataset?.value || 0 - return datasetVal - .toString() - .padStart(flipperLength.value, '0') - .split('') - .slice(flipperLength.value * -1) -}) - -useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: number) => { +useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number) => { updateDatasetHandler(newVal) }) </script> @@ -78,8 +77,5 @@ useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: number) => { @include go('decorates-more-countdown') { width: v-bind('`${w}px`'); height: v-bind('`${h}px`'); - display: flex; - align-items: center; - justify-content: center; } </style> diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts new file mode 100644 index 00000000..347e3681 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts @@ -0,0 +1,39 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { FlipperNumberConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import { chartInitConfig } from '@/settings/designSetting' +import { FlipType } from '@/components/Flipper' + +export interface OptionType { + dataset: number | string + flipperLength: number + flipperBgColor: string + flipperTextColor: string + flipperWidth: number + flipperHeight: number + flipperRadius: number + flipperGap: number + flipperType: FlipType + flipperSpeed: number +} + +export const option: OptionType = { + dataset: 203234, + flipperLength: 6, + flipperBgColor: '#253E4E', + flipperTextColor: '#7CFFB2FF', + flipperWidth: 60, + flipperHeight: 100, + flipperRadius: 10, + flipperGap: 10, + flipperType: 'down', + flipperSpeed: 450 +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = FlipperNumberConfig.key + public attr = { ...chartInitConfig, w: 500, h: 200, zIndex: -1 } + public chartConfig = cloneDeep(FlipperNumberConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.vue b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue new file mode 100644 index 00000000..a7478250 --- /dev/null +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue @@ -0,0 +1,72 @@ +<template> + <collapse-item name="翻牌" :expanded="true"> + <setting-item-box name="内容"> + <setting-item name="初始值"> + <n-input-number v-model:value="optionData.dataset" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="个数"> + <n-input-number v-model:value="optionData.flipperLength" size="small" :min="1"></n-input-number> + </setting-item> + </setting-item-box> + + <setting-item-box name="样式"> + <setting-item name="宽度"> + <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> + </setting-item> + <setting-item name="高度"> + <n-input-number v-model:value="optionData.flipperHeight" size="small" :min="1"></n-input-number> + </setting-item> + <setting-item name="间隔"> + <n-input-number v-model:value="optionData.flipperGap" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="圆角"> + <n-input-number v-model:value="optionData.flipperRadius" size="small" :min="0"></n-input-number> + </setting-item> + <setting-item name="背景色"> + <n-color-picker + size="small" + :show-alpha="false" + :modes="['hex']" + v-model:value="optionData.flipperBgColor" + ></n-color-picker> + </setting-item> + <setting-item name="字体色"> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker> + </setting-item> + </setting-item-box> + + <setting-item-box name="行为"> + <setting-item name="动画"> + <n-select + v-model:value="optionData.flipperType" + size="small" + :options="[ + { label: '下翻', value: 'down' }, + { label: '上翻', value: 'up' } + ]" + ></n-select> + </setting-item> + <setting-item name="翻牌速度"> + <n-input-number + v-model:value="optionData.flipperSpeed" + size="small" + :min="100" + :max="900" + :step="100" + ></n-input-number> + </setting-item> + </setting-item-box> + </collapse-item> +</template> +<script setup lang="ts"> +import { PropType } from 'vue' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' +import { OptionType } from './config' + +defineProps({ + optionData: { + type: Object as PropType<OptionType>, + required: true + } +}) +</script> diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.ts b/src/packages/components/Decorates/Mores/FlipperNumber/index.ts new file mode 100644 index 00000000..2e3d883b --- /dev/null +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.ts @@ -0,0 +1,14 @@ +import image from '@/assets/images/chart/decorates/time.png' +import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' + +export const FlipperNumberConfig: ConfigType = { + key: 'FlipperNumber', + chartKey: 'VFlipperNumber', + conKey: 'VCFlipperNumber', + title: '数字翻牌2', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.DECORATES, + image +} diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue new file mode 100644 index 00000000..34a6defa --- /dev/null +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue @@ -0,0 +1,81 @@ +<template> + <!-- <n-countdown :duration="50000" :active="true" /> --> + <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in flipperData" + :key="index" + /> + </n-space> +</template> + +<script setup lang="ts"> +import { PropType, toRefs, watch, ref } from 'vue' +import { CreateComponentType } from '@/packages/index.d' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { useChartDataFetch } from '@/hooks' +import { Flipper } from '@/components/Flipper' +import { OptionType } from './config' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) + +const { w, h } = toRefs(props.chartConfig.attr) + +const { + flipperLength, + flipperBgColor, + flipperTextColor, + flipperWidth, + flipperHeight, + flipperRadius, + flipperGap, + flipperType, + flipperSpeed +} = toRefs(props.chartConfig.option as OptionType) + +const flipperData = ref<string[] | number[]>([]) +const getFlipperData = (val: string | number) => { + return val + .toString() + .padStart(flipperLength.value, '0') // 左侧填充|右对齐 + .split('') // 转数组 + .slice(flipperLength.value * -1) // 从右向左取 +} +const updateDatasetHandler = (newVal: string | number) => { + flipperData.value = getFlipperData(newVal) +} + +watch( + () => props.chartConfig.option, + newVal => { + updateDatasetHandler((newVal as OptionType).dataset) + }, + { + immediate: true, + deep: true + } +) + +useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number) => { + updateDatasetHandler(newVal) +}) +</script> + +<style lang="scss" scoped> +@include go('decorates-more-countdown') { + width: v-bind('`${w}px`'); + height: v-bind('`${h}px`'); +} +</style> diff --git a/src/packages/components/Decorates/Mores/index.ts b/src/packages/components/Decorates/Mores/index.ts index bc6a3849..855f6e27 100644 --- a/src/packages/components/Decorates/Mores/index.ts +++ b/src/packages/components/Decorates/Mores/index.ts @@ -2,5 +2,6 @@ import { NumberConfig } from './Number/index' import { TimeCommonConfig } from './TimeCommon/index' import { ClockConfig } from './Clock/index' import { CountDownConfig } from './CountDown/index' +import { FlipperNumberConfig } from './FlipperNumber' -export default [TimeCommonConfig, CountDownConfig, NumberConfig, ClockConfig] +export default [NumberConfig, FlipperNumberConfig, TimeCommonConfig, CountDownConfig, ClockConfig] From 4048d4a418d2d2e1616230a6f80a391a47609479 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Fri, 30 Sep 2022 11:39:41 +0800 Subject: [PATCH 28/56] =?UTF-8?q?feat:=20=E5=8A=A0=E5=85=A5=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE=EF=BC=8C=E5=AE=8C=E6=88=90=E5=80=92=E8=AE=A1?= =?UTF-8?q?=E6=97=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/chart/decorates/countdown.png | Bin 0 -> 18163 bytes .../images/chart/decorates/flipper-number.png | Bin 0 -> 12441 bytes .../Decorates/Mores/CountDown/config.ts | 20 ++- .../Decorates/Mores/CountDown/config.vue | 37 ++++- .../Decorates/Mores/CountDown/index.ts | 2 +- .../Decorates/Mores/CountDown/index.vue | 136 +++++++++++++++--- .../Decorates/Mores/FlipperNumber/config.ts | 4 +- .../Decorates/Mores/FlipperNumber/config.vue | 4 +- .../Decorates/Mores/FlipperNumber/index.ts | 4 +- .../Decorates/Mores/Number/index.ts | 4 +- 10 files changed, 172 insertions(+), 39 deletions(-) create mode 100644 src/assets/images/chart/decorates/countdown.png create mode 100644 src/assets/images/chart/decorates/flipper-number.png diff --git a/src/assets/images/chart/decorates/countdown.png b/src/assets/images/chart/decorates/countdown.png new file mode 100644 index 0000000000000000000000000000000000000000..06d168117cb46d85ab9197f562a3230edfa64281 GIT binary patch literal 18163 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�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 literal 0 HcmV?d00001 diff --git a/src/assets/images/chart/decorates/flipper-number.png b/src/assets/images/chart/decorates/flipper-number.png new file mode 100644 index 0000000000000000000000000000000000000000..a02939f02a37913af9b7a86158ec591815ff8891 GIT binary patch literal 12441 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 VwvJst{lWoIl2etfls5nTzW|4)_V)k) literal 0 HcmV?d00001 diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index 5440a13a..7131bcaf 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -5,8 +5,14 @@ import cloneDeep from 'lodash/cloneDeep' import { chartInitConfig } from '@/settings/designSetting' import { FlipType } from '@/components/Flipper' +type STYLE = '时分秒' | '冒号' + export interface OptionType { - dataset: number | string + dataset: number + fixedDate: boolean + endDate: number + style: STYLE + showDay: boolean flipperLength: number flipperBgColor: string flipperTextColor: string @@ -19,10 +25,14 @@ export interface OptionType { } export const option: OptionType = { - dataset: 203234, + dataset: 10 * 60, // 10分钟 + fixedDate: false, + endDate: new Date().getTime(), // 当前时间 + style: '时分秒', + showDay: true, flipperLength: 6, - flipperBgColor: '#ee6600', - flipperTextColor: '#FFFFFFFF', + flipperBgColor: '#253E4E', + flipperTextColor: '#7CFFB2FF', flipperWidth: 60, flipperHeight: 100, flipperRadius: 10, @@ -33,7 +43,7 @@ export const option: OptionType = { export default class Config extends PublicConfigClass implements CreateComponentType { public key = CountDownConfig.key - public attr = { ...chartInitConfig, w: 500, h: 200, zIndex: -1 } + public attr = { ...chartInitConfig, w: 950, h: 160, zIndex: -1 } public chartConfig = cloneDeep(CountDownConfig) public option = cloneDeep(option) } diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index a7478250..00aae7df 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -1,14 +1,24 @@ <template> - <collapse-item name="翻牌" :expanded="true"> - <setting-item-box name="内容"> - <setting-item name="初始值"> - <n-input-number v-model:value="optionData.dataset" size="small" :min="0"></n-input-number> + <collapse-item name="倒计时" :expanded="true"> + <setting-item-box name="内容" alone> + <setting-item name="计时(秒)"> + <n-input-number + v-model:value="optionData.dataset" + size="small" + :min="0" + :disabled="optionData.fixedDate" + ></n-input-number> </setting-item> - <setting-item name="个数"> - <n-input-number v-model:value="optionData.flipperLength" size="small" :min="1"></n-input-number> + <setting-item name="结束日期"> + <n-date-picker v-model:value="optionData.endDate" type="datetime" :disabled="!optionData.fixedDate" /> + </setting-item> + <setting-item> + <n-checkbox v-model:checked="optionData.fixedDate" size="small">使用固定日期</n-checkbox> </setting-item> </setting-item-box> + </collapse-item> + <collapse-item name="翻牌" :expanded="true"> <setting-item-box name="样式"> <setting-item name="宽度"> <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> @@ -33,6 +43,19 @@ <setting-item name="字体色"> <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker> </setting-item> + <setting-item name="风格"> + <n-select + v-model:value="optionData.style" + size="small" + :options="[ + { label: '时分秒', value: '时分秒' }, + { label: '冒号', value: '冒号' } + ]" + ></n-select> + </setting-item> + <setting-item> + <n-checkbox v-model:checked="optionData.showDay" size="small">显示天</n-checkbox> + </setting-item> </setting-item-box> <setting-item-box name="行为"> @@ -46,7 +69,7 @@ ]" ></n-select> </setting-item> - <setting-item name="翻牌速度"> + <setting-item name="翻牌速度(毫秒)"> <n-input-number v-model:value="optionData.flipperSpeed" size="small" diff --git a/src/packages/components/Decorates/Mores/CountDown/index.ts b/src/packages/components/Decorates/Mores/CountDown/index.ts index b745355c..6755fdda 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.ts +++ b/src/packages/components/Decorates/Mores/CountDown/index.ts @@ -1,4 +1,4 @@ -import image from '@/assets/images/chart/decorates/time.png' +import image from '@/assets/images/chart/decorates/countdown.png' import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index 34a6defa..ad24c6b3 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -1,6 +1,29 @@ <template> - <!-- <n-countdown :duration="50000" :active="true" /> --> + <n-countdown + ref="countdownRef" + :duration="totalDuration" + :render="renderCountdown" + :active="countdownActive" + v-show="false" + /> <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> + <template v-if="showDay"> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in daysFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">天</div> + <div v-else>:</div> + </template> <flipper :count="item" :width="flipperWidth" @@ -10,19 +33,50 @@ :radius="flipperRadius" :flip-type="flipperType" :duration="flipperSpeed" - v-for="(item, index) in flipperData" + v-for="(item, index) in hoursFlipperData" :key="index" + class="go-d-block" /> + <div v-if="style === '时分秒'">时</div> + <div v-else>:</div> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in minutesFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">分</div> + <div v-else>:</div> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in secondsFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">秒</div> </n-space> </template> <script setup lang="ts"> -import { PropType, toRefs, watch, ref } from 'vue' +import { PropType, toRefs, watch, ref, onMounted } from 'vue' import { CreateComponentType } from '@/packages/index.d' -import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { useChartDataFetch } from '@/hooks' import { Flipper } from '@/components/Flipper' import { OptionType } from './config' +import { CountdownInst, CountdownProps } from 'naive-ui/es/countdown/src/Countdown' const props = defineProps({ chartConfig: { @@ -34,7 +88,11 @@ const props = defineProps({ const { w, h } = toRefs(props.chartConfig.attr) const { - flipperLength, + dataset, + fixedDate, + endDate, + style, + showDay, flipperBgColor, flipperTextColor, flipperWidth, @@ -45,31 +103,70 @@ const { flipperSpeed } = toRefs(props.chartConfig.option as OptionType) -const flipperData = ref<string[] | number[]>([]) +const countdownRef = ref<CountdownInst | null>() +const countdownActive = ref(false) + +const totalDuration = ref(dataset.value * 1000) +const daysFlipperData = ref<string[] | number[]>([]) +const hoursFlipperData = ref<string[] | number[]>([]) +const minutesFlipperData = ref<string[] | number[]>([]) +const secondsFlipperData = ref<string[] | number[]>([]) const getFlipperData = (val: string | number) => { + const len = Math.max(val.toString().length, 2) return val .toString() - .padStart(flipperLength.value, '0') // 左侧填充|右对齐 + .padStart(len, '0') // 左侧填充|右对齐 .split('') // 转数组 - .slice(flipperLength.value * -1) // 从右向左取 } -const updateDatasetHandler = (newVal: string | number) => { - flipperData.value = getFlipperData(newVal) +const updateDatasetHandler = (hours: number, minutes: number, seconds: number) => { + const days = Math.floor(hours / 24) + daysFlipperData.value = getFlipperData(days) + hoursFlipperData.value = getFlipperData(showDay.value ? hours % 24 : hours) + minutesFlipperData.value = getFlipperData(minutes) + secondsFlipperData.value = getFlipperData(seconds) +} + +const renderCountdown: CountdownProps['render'] = ({ hours, minutes, seconds }) => { + updateDatasetHandler(hours, minutes, seconds) +} + +const updateTotalDuration = () => { + countdownActive.value = false + totalDuration.value = fixedDate.value ? endDate.value - new Date().getTime() : dataset.value * 1000 + countdownRef.value?.reset && countdownRef.value?.reset() + countdownActive.value = true } watch( - () => props.chartConfig.option, - newVal => { - updateDatasetHandler((newVal as OptionType).dataset) + () => props.chartConfig.option.dataset, + () => { + updateTotalDuration() }, { - immediate: true, - deep: true + immediate: true + } +) +watch( + () => props.chartConfig.option.endDate, + () => { + updateTotalDuration() + }, + { + immediate: true + } +) +watch( + () => props.chartConfig.option.fixedDate, + () => { + updateTotalDuration() + }, + { + immediate: true } ) -useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number) => { - updateDatasetHandler(newVal) +onMounted(() => { + updateTotalDuration() }) </script> @@ -77,5 +174,8 @@ useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number @include go('decorates-more-countdown') { width: v-bind('`${w}px`'); height: v-bind('`${h}px`'); + font-size: v-bind('`${flipperWidth}px`'); + line-height: v-bind('`${flipperHeight}px`'); + color: v-bind('flipperTextColor'); } </style> diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts index 347e3681..ef074f7c 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts @@ -19,7 +19,7 @@ export interface OptionType { } export const option: OptionType = { - dataset: 203234, + dataset: 3234, flipperLength: 6, flipperBgColor: '#253E4E', flipperTextColor: '#7CFFB2FF', @@ -33,7 +33,7 @@ export const option: OptionType = { export default class Config extends PublicConfigClass implements CreateComponentType { public key = FlipperNumberConfig.key - public attr = { ...chartInitConfig, w: 500, h: 200, zIndex: -1 } + public attr = { ...chartInitConfig, w: 500, h: 160, zIndex: -1 } public chartConfig = cloneDeep(FlipperNumberConfig) public option = cloneDeep(option) } diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.vue b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue index a7478250..f2c65a96 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.vue +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.vue @@ -4,7 +4,7 @@ <setting-item name="初始值"> <n-input-number v-model:value="optionData.dataset" size="small" :min="0"></n-input-number> </setting-item> - <setting-item name="个数"> + <setting-item name="翻牌个数"> <n-input-number v-model:value="optionData.flipperLength" size="small" :min="1"></n-input-number> </setting-item> </setting-item-box> @@ -46,7 +46,7 @@ ]" ></n-select> </setting-item> - <setting-item name="翻牌速度"> + <setting-item name="翻牌速度(毫秒)"> <n-input-number v-model:value="optionData.flipperSpeed" size="small" diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.ts b/src/packages/components/Decorates/Mores/FlipperNumber/index.ts index 2e3d883b..16aa2137 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/index.ts +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.ts @@ -1,4 +1,4 @@ -import image from '@/assets/images/chart/decorates/time.png' +import image from '@/assets/images/chart/decorates/flipper-number.png' import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' @@ -6,7 +6,7 @@ export const FlipperNumberConfig: ConfigType = { key: 'FlipperNumber', chartKey: 'VFlipperNumber', conKey: 'VCFlipperNumber', - title: '数字翻牌2', + title: '数字翻牌', category: ChatCategoryEnum.MORE, categoryName: ChatCategoryEnumName.MORE, package: PackagesCategoryEnum.DECORATES, diff --git a/src/packages/components/Decorates/Mores/Number/index.ts b/src/packages/components/Decorates/Mores/Number/index.ts index 7a5d54fc..ff9a9469 100644 --- a/src/packages/components/Decorates/Mores/Number/index.ts +++ b/src/packages/components/Decorates/Mores/Number/index.ts @@ -1,12 +1,12 @@ import image from '@/assets/images/chart/decorates/number.png' import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d' -import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' +import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d' export const NumberConfig: ConfigType = { key: 'Number', chartKey: 'VNumber', conKey: 'VCNumber', - title: '数字翻牌', + title: '数字计数', category: ChatCategoryEnum.MORE, categoryName: ChatCategoryEnumName.MORE, package: PackagesCategoryEnum.DECORATES, From 5220cae94a087be167f34b3445e81011e78b5b1a Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Fri, 30 Sep 2022 12:18:46 +0800 Subject: [PATCH 29/56] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E5=B1=9E=E6=80=A7=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Decorates/Mores/CountDown/config.vue | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index 00aae7df..43827977 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -1,5 +1,5 @@ <template> - <collapse-item name="倒计时" :expanded="true"> + <collapse-item name="倒计时" expanded> <setting-item-box name="内容" alone> <setting-item name="计时(秒)"> <n-input-number @@ -16,9 +16,25 @@ <n-checkbox v-model:checked="optionData.fixedDate" size="small">使用固定日期</n-checkbox> </setting-item> </setting-item-box> + + <setting-item-box name="样式"> + <setting-item name="风格"> + <n-select + v-model:value="optionData.style" + size="small" + :options="[ + { label: '时分秒', value: '时分秒' }, + { label: '冒号', value: '冒号' } + ]" + ></n-select> + </setting-item> + <setting-item> + <n-checkbox v-model:checked="optionData.showDay" size="small">显示天</n-checkbox> + </setting-item> + </setting-item-box> </collapse-item> - <collapse-item name="翻牌" :expanded="true"> + <collapse-item name="翻牌" expanded> <setting-item-box name="样式"> <setting-item name="宽度"> <n-input-number v-model:value="optionData.flipperWidth" size="small" :min="1"></n-input-number> @@ -43,19 +59,6 @@ <setting-item name="字体色"> <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.flipperTextColor"></n-color-picker> </setting-item> - <setting-item name="风格"> - <n-select - v-model:value="optionData.style" - size="small" - :options="[ - { label: '时分秒', value: '时分秒' }, - { label: '冒号', value: '冒号' } - ]" - ></n-select> - </setting-item> - <setting-item> - <n-checkbox v-model:checked="optionData.showDay" size="small">显示天</n-checkbox> - </setting-item> </setting-item-box> <setting-item-box name="行为"> From f96a9c9d6f8c95c60564d0919b1b298427fbe1db 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: Fri, 30 Sep 2022 15:43:58 +0800 Subject: [PATCH 30/56] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=A5=BC?= =?UTF-8?q?=E5=9B=BE=E7=8E=AF=E5=BD=A2=E6=95=B0=E5=80=BC=E4=B8=8D=E5=87=BA?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/components/Charts/Pies/PieCircle/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/packages/components/Charts/Pies/PieCircle/index.vue b/src/packages/components/Charts/Pies/PieCircle/index.vue index eb9c4ea9..61c50049 100644 --- a/src/packages/components/Charts/Pies/PieCircle/index.vue +++ b/src/packages/components/Charts/Pies/PieCircle/index.vue @@ -12,7 +12,7 @@ import { mergeTheme } from '@/packages/public/chart' import config, { includes } from './config' import { useChartDataFetch } from '@/hooks' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' +import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent, TitleComponent } from 'echarts/components' const props = defineProps({ themeSetting: { @@ -29,7 +29,7 @@ const props = defineProps({ } }) -use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent]) +use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent]) const option = reactive({ value: {} From 96def0107d8e15b31ef68876ee10fe0abab942ef 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: Fri, 30 Sep 2022 16:03:35 +0800 Subject: [PATCH 31/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BB=B6=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=95=B0=E6=8D=AE=EF=BC=8C=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=BC=9A=E5=8D=A1=E6=AD=BB=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/axios.ts | 1 - src/packages/components/Charts/Bars/BarCommon/index.vue | 6 ++++-- src/packages/components/Charts/Bars/BarCrossrange/index.vue | 4 +++- src/packages/components/Charts/Lines/LineCommon/index.vue | 4 +++- src/packages/components/Charts/Mores/TreeMap/index.vue | 3 ++- src/packages/components/Charts/Mores/WaterPolo/index.vue | 3 ++- src/packages/components/Charts/Pies/PieCommon/index.vue | 2 +- .../components/Charts/Scatters/ScatterCommon/index.vue | 3 ++- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/api/axios.ts b/src/api/axios.ts index c913ea09..9833998f 100644 --- a/src/api/axios.ts +++ b/src/api/axios.ts @@ -27,7 +27,6 @@ axiosInstance.interceptors.response.use( return Promise.resolve(res.data) }, (err: AxiosResponse) => { - window['$message'].error('接口异常,请检查!') Promise.reject(err) } ) diff --git a/src/packages/components/Charts/Bars/BarCommon/index.vue b/src/packages/components/Charts/Bars/BarCommon/index.vue index b186a6d1..54aaa27b 100644 --- a/src/packages/components/Charts/Bars/BarCommon/index.vue +++ b/src/packages/components/Charts/Bars/BarCommon/index.vue @@ -24,6 +24,7 @@ import { CreateComponentType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { isPreview } from '@/utils' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' +import isObject from 'lodash/isObject' const props = defineProps({ themeSetting: { @@ -51,8 +52,9 @@ const option = computed(() => { // dataset 无法变更条数的补丁 watch( () => props.chartConfig.option.dataset, - (newData, oldData) => { - if (newData.dimensions.length !== oldData.dimensions.length) { + (newData: { dimensions: any }, oldData) => { + if (!isObject(newData) || !('dimensions' in newData)) return + if (newData?.dimensions.length !== oldData?.dimensions.length) { const seriesArr = [] for (let i = 0; i < newData.dimensions.length - 1; i++) { seriesArr.push(seriesItem) diff --git a/src/packages/components/Charts/Bars/BarCrossrange/index.vue b/src/packages/components/Charts/Bars/BarCrossrange/index.vue index 5e928ee0..d42ce328 100644 --- a/src/packages/components/Charts/Bars/BarCrossrange/index.vue +++ b/src/packages/components/Charts/Bars/BarCrossrange/index.vue @@ -23,6 +23,7 @@ import { useChartDataFetch } from '@/hooks' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { isPreview } from '@/utils' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' +import isObject from 'lodash/isObject' const props = defineProps({ themeSetting: { @@ -50,7 +51,8 @@ const option = computed(() => { // dataset 无法变更条数的补丁 watch( () => props.chartConfig.option.dataset, - (newData, oldData) => { + (newData: { dimensions: any }, oldData) => { + if (!isObject(newData) || !('dimensions' in newData)) return if (newData?.dimensions.length !== oldData?.dimensions.length) { const seriesArr = [] for (let i = 0; i < newData.dimensions.length - 1; i++) { diff --git a/src/packages/components/Charts/Lines/LineCommon/index.vue b/src/packages/components/Charts/Lines/LineCommon/index.vue index 4af2be19..8a5c4f44 100644 --- a/src/packages/components/Charts/Lines/LineCommon/index.vue +++ b/src/packages/components/Charts/Lines/LineCommon/index.vue @@ -24,6 +24,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore import { useChartDataFetch } from '@/hooks' import { isPreview } from '@/utils' import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent } from 'echarts/components' +import isObject from 'lodash/isObject' const props = defineProps({ themeSetting: { @@ -51,7 +52,8 @@ const option = computed(() => { // dataset 无法变更条数的补丁 watch( () => props.chartConfig.option.dataset, - (newData, oldData) => { + (newData: { dimensions: any }, oldData) => { + if (!isObject(newData) || !('dimensions' in newData)) return if (newData?.dimensions.length !== oldData?.dimensions.length) { const seriesArr = [] for (let i = 0; i < newData.dimensions.length - 1; i++) { diff --git a/src/packages/components/Charts/Mores/TreeMap/index.vue b/src/packages/components/Charts/Mores/TreeMap/index.vue index de2516ea..1e0801ee 100644 --- a/src/packages/components/Charts/Mores/TreeMap/index.vue +++ b/src/packages/components/Charts/Mores/TreeMap/index.vue @@ -14,7 +14,7 @@ import { mergeTheme } from '@/packages/public/chart' import { useChartDataFetch } from '@/hooks' import { CreateComponentType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { isPreview } from '@/utils' +import { isPreview, isArray } from '@/utils' const props = defineProps({ themeSetting: { @@ -49,6 +49,7 @@ const dataSetHandle = (dataset: typeof dataJson) => { watch( () => props.chartConfig.option.dataset, newData => { + if(!isArray(newData)) return dataSetHandle(newData) }, { diff --git a/src/packages/components/Charts/Mores/WaterPolo/index.vue b/src/packages/components/Charts/Mores/WaterPolo/index.vue index 14112d94..30038f01 100644 --- a/src/packages/components/Charts/Mores/WaterPolo/index.vue +++ b/src/packages/components/Charts/Mores/WaterPolo/index.vue @@ -10,7 +10,7 @@ import 'echarts-liquidfill/src/liquidFill.js' import { CanvasRenderer } from 'echarts/renderers' import { GridComponent } from 'echarts/components' import config from './config' -import { isPreview, isString } from '@/utils' +import { isPreview, isString, isNumber } from '@/utils' import { chartColorsSearch, defaultTheme } from '@/settings/chartThemes/index' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartDataFetch } from '@/hooks' @@ -75,6 +75,7 @@ const dataHandle = (newData: number | string) => { watch( () => props.chartConfig.option.dataset, newData => { + if(!isString(newData) && !isNumber(newData)) return props.chartConfig.option.series[0].data = [dataHandle(newData)] option.value = props.chartConfig.option }, diff --git a/src/packages/components/Charts/Pies/PieCommon/index.vue b/src/packages/components/Charts/Pies/PieCommon/index.vue index 3f47c66a..e8f2c68a 100644 --- a/src/packages/components/Charts/Pies/PieCommon/index.vue +++ b/src/packages/components/Charts/Pies/PieCommon/index.vue @@ -50,7 +50,7 @@ watch( props.chartConfig.option.series[0].roseType = true } }, - { deep: true, immediate: true } + { deep: false, immediate: true } ) const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore) diff --git a/src/packages/components/Charts/Scatters/ScatterCommon/index.vue b/src/packages/components/Charts/Scatters/ScatterCommon/index.vue index a68c0911..945df53d 100644 --- a/src/packages/components/Charts/Scatters/ScatterCommon/index.vue +++ b/src/packages/components/Charts/Scatters/ScatterCommon/index.vue @@ -20,7 +20,7 @@ import config, { includes, seriesItem } from './config' import { mergeTheme } from '@/packages/public/chart' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useChartDataFetch } from '@/hooks' -import { isPreview } from '@/utils' +import { isPreview, isArray } from '@/utils' import { DatasetComponent, GridComponent, @@ -69,6 +69,7 @@ const option = computed(() => { watch( () => props.chartConfig.option.dataset, (newData, oldData) => { + if (!isArray(newData)) return if (newData?.length !== oldData?.length) { replaceMergeArr.value = ['series'] // eslint-disable-next-line vue/no-mutating-props From 3c802d44f420a105664c6b8cc687cd0a3b9b3810 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: Fri, 30 Sep 2022 16:21:52 +0800 Subject: [PATCH 32/56] =?UTF-8?q?perf:=20=E6=97=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=97=B6=E5=80=99=E7=9A=84=E7=A6=81=E6=AD=A2=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=92=8C=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChartData/components/ChartDataMatchingAndShow/index.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue index afb4422e..8c36f1d8 100644 --- a/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataMatchingAndShow/index.vue @@ -41,7 +41,7 @@ @before-upload="beforeUpload" > <n-space> - <n-button v-if="!ajax" class="sourceBtn-item"> + <n-button v-if="!ajax" class="sourceBtn-item" :disabled="noData"> <template #icon> <n-icon> <document-add-icon /> @@ -52,7 +52,7 @@ </n-space> </n-upload> <div> - <n-button class="sourceBtn-item" @click="download"> + <n-button class="sourceBtn-item" :disabled="noData" @click="download"> <template #icon> <n-icon> <document-download-icon /> @@ -111,6 +111,7 @@ const { DocumentAddIcon, DocumentDownloadIcon } = icon.carbon const source = ref() const dimensions = ref() const dimensionsAndSource = ref() +const noData = ref(false) const { uploadFileListRef, customRequest, beforeUpload, download } = useFile(targetData) @@ -180,6 +181,7 @@ watch( dimensionsAndSource.value = null source.value = newData } else { + noData.value = true source.value = '此组件无数据源' } if (isArray(newData)) { From 2036a509f063f442442aef929cd7c28283d2fbb6 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Fri, 30 Sep 2022 22:25:08 +0800 Subject: [PATCH 33/56] =?UTF-8?q?style:=20=E8=B0=83=E6=95=B4=E7=BF=BB?= =?UTF-8?q?=E7=89=8C=E9=BB=98=E8=AE=A4=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Decorates/Mores/CountDown/config.ts | 16 +++++++--------- .../Decorates/Mores/CountDown/config.vue | 6 +++--- .../Decorates/Mores/CountDown/index.vue | 7 ++++--- .../Decorates/Mores/FlipperNumber/config.ts | 8 ++++---- .../Decorates/Mores/FlipperNumber/index.vue | 7 ++++--- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index 7131bcaf..daa32918 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -9,11 +9,10 @@ type STYLE = '时分秒' | '冒号' export interface OptionType { dataset: number - fixedDate: boolean + useEndDate: boolean endDate: number style: STYLE showDay: boolean - flipperLength: number flipperBgColor: string flipperTextColor: string flipperWidth: number @@ -26,16 +25,15 @@ export interface OptionType { export const option: OptionType = { dataset: 10 * 60, // 10分钟 - fixedDate: false, + useEndDate: false, endDate: new Date().getTime(), // 当前时间 style: '时分秒', - showDay: true, - flipperLength: 6, + showDay: false, flipperBgColor: '#253E4E', flipperTextColor: '#7CFFB2FF', - flipperWidth: 60, - flipperHeight: 100, - flipperRadius: 10, + flipperWidth: 30, + flipperHeight: 50, + flipperRadius: 5, flipperGap: 10, flipperType: 'down', flipperSpeed: 450 @@ -43,7 +41,7 @@ export const option: OptionType = { export default class Config extends PublicConfigClass implements CreateComponentType { public key = CountDownConfig.key - public attr = { ...chartInitConfig, w: 950, h: 160, zIndex: -1 } + public attr = { ...chartInitConfig, w: 500, h: 100, zIndex: -1 } public chartConfig = cloneDeep(CountDownConfig) public option = cloneDeep(option) } diff --git a/src/packages/components/Decorates/Mores/CountDown/config.vue b/src/packages/components/Decorates/Mores/CountDown/config.vue index 43827977..0b92d80e 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.vue +++ b/src/packages/components/Decorates/Mores/CountDown/config.vue @@ -6,14 +6,14 @@ v-model:value="optionData.dataset" size="small" :min="0" - :disabled="optionData.fixedDate" + :disabled="optionData.useEndDate" ></n-input-number> </setting-item> <setting-item name="结束日期"> - <n-date-picker v-model:value="optionData.endDate" type="datetime" :disabled="!optionData.fixedDate" /> + <n-date-picker v-model:value="optionData.endDate" type="datetime" :disabled="!optionData.useEndDate" /> </setting-item> <setting-item> - <n-checkbox v-model:checked="optionData.fixedDate" size="small">使用固定日期</n-checkbox> + <n-checkbox v-model:checked="optionData.useEndDate" size="small">使用固定结束日期</n-checkbox> </setting-item> </setting-item-box> diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index ad24c6b3..8dde8706 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -89,7 +89,7 @@ const { w, h } = toRefs(props.chartConfig.attr) const { dataset, - fixedDate, + useEndDate, endDate, style, showDay, @@ -132,7 +132,7 @@ const renderCountdown: CountdownProps['render'] = ({ hours, minutes, seconds }) const updateTotalDuration = () => { countdownActive.value = false - totalDuration.value = fixedDate.value ? endDate.value - new Date().getTime() : dataset.value * 1000 + totalDuration.value = useEndDate.value ? endDate.value - new Date().getTime() : dataset.value * 1000 countdownRef.value?.reset && countdownRef.value?.reset() countdownActive.value = true } @@ -156,7 +156,7 @@ watch( } ) watch( - () => props.chartConfig.option.fixedDate, + () => props.chartConfig.option.useEndDate, () => { updateTotalDuration() }, @@ -177,5 +177,6 @@ onMounted(() => { font-size: v-bind('`${flipperWidth}px`'); line-height: v-bind('`${flipperHeight}px`'); color: v-bind('flipperTextColor'); + user-select: none; } </style> diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts index ef074f7c..d7410da5 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts @@ -23,9 +23,9 @@ export const option: OptionType = { flipperLength: 6, flipperBgColor: '#253E4E', flipperTextColor: '#7CFFB2FF', - flipperWidth: 60, - flipperHeight: 100, - flipperRadius: 10, + flipperWidth: 30, + flipperHeight: 50, + flipperRadius: 5, flipperGap: 10, flipperType: 'down', flipperSpeed: 450 @@ -33,7 +33,7 @@ export const option: OptionType = { export default class Config extends PublicConfigClass implements CreateComponentType { public key = FlipperNumberConfig.key - public attr = { ...chartInitConfig, w: 500, h: 160, zIndex: -1 } + public attr = { ...chartInitConfig, w: 300, h: 100, zIndex: -1 } public chartConfig = cloneDeep(FlipperNumberConfig) public option = cloneDeep(option) } diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue index 34a6defa..d831c4ed 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue @@ -1,6 +1,6 @@ <template> <!-- <n-countdown :duration="50000" :active="true" /> --> - <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> + <n-space class="go-decorates-flipper-number" :size="flipperGap" align="center" justify="center"> <flipper :count="item" :width="flipperWidth" @@ -12,6 +12,7 @@ :duration="flipperSpeed" v-for="(item, index) in flipperData" :key="index" + class="go-d-block" /> </n-space> </template> @@ -51,7 +52,7 @@ const getFlipperData = (val: string | number) => { .toString() .padStart(flipperLength.value, '0') // 左侧填充|右对齐 .split('') // 转数组 - .slice(flipperLength.value * -1) // 从右向左取 + .slice(flipperLength.value * -1) // 从后面取指定长度 } const updateDatasetHandler = (newVal: string | number) => { flipperData.value = getFlipperData(newVal) @@ -74,7 +75,7 @@ useChartDataFetch(props.chartConfig, useChartEditStore, (newVal: string | number </script> <style lang="scss" scoped> -@include go('decorates-more-countdown') { +@include go('decorates-flipper-number') { width: v-bind('`${w}px`'); height: v-bind('`${h}px`'); } From d0f3490bd558e59744c8d6d3b52dba0a0fee4f9c Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 1 Oct 2022 10:27:11 +0800 Subject: [PATCH 34/56] =?UTF-8?q?style:=20=E8=B0=83=E6=95=B4=E7=BC=A9?= =?UTF-8?q?=E7=95=A5=E5=9B=BE=E5=92=8C=E9=BB=98=E8=AE=A4=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/chart/decorates/countdown.png | Bin 18163 -> 27851 bytes .../images/chart/decorates/flipper-number.png | Bin 12441 -> 27933 bytes src/components/Flipper/index.vue | 88 +++++++++--------- .../Decorates/Mores/CountDown/config.ts | 4 +- .../Decorates/Mores/FlipperNumber/config.ts | 4 +- 5 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/assets/images/chart/decorates/countdown.png b/src/assets/images/chart/decorates/countdown.png index 06d168117cb46d85ab9197f562a3230edfa64281..c414a3162bc5ef07e34889b9024b621216060703 100644 GIT binary patch literal 27851 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 F_-~Zuxr6`! delta 15252 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 diff --git a/src/assets/images/chart/decorates/flipper-number.png b/src/assets/images/chart/decorates/flipper-number.png index a02939f02a37913af9b7a86158ec591815ff8891..b64d4fd469706b97e240a65df6200f9513733ff7 100644 GIT binary patch literal 27933 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 delta 9483 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 NH6=~O3i%hW{}($!-0J`U diff --git a/src/components/Flipper/index.vue b/src/components/Flipper/index.vue index 72807c5e..7757d536 100644 --- a/src/components/Flipper/index.vue +++ b/src/components/Flipper/index.vue @@ -86,48 +86,50 @@ watch( </script> <style lang="scss" scoped> -// #region 动画效果 -@keyframes frontFlipDown { - 0% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); - } - 100% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); - } -} -@keyframes backFlipDown { - 0% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); - } - 100% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); - } -} -@keyframes frontFlipUp { - 0% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); - } - 100% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); - } -} -@keyframes backFlipUp { - 0% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); - } - 100% { - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(0deg); - } -} -// #endregion - $frontColor: v-bind('props.frontColor'); $backColor: v-bind('props.backColor'); $radius: v-bind('`${props.radius}px`'); $width: v-bind('`${props.width}px`'); $height: v-bind('`${props.height}px`'); +$perspective: v-bind('`${props.height * 2}px`'); +$speed: v-bind('`${props.duration / 1000}s`'); $shadowColor: #000000; -$lineColor: #ffffff; +$lineColor: #4a9ef8; + +// #region 动画效果 +@keyframes frontFlipDown { + 0% { + transform: perspective($perspective) rotateX(0deg); + } + 100% { + transform: perspective($perspective) rotateX(-180deg); + } +} +@keyframes backFlipDown { + 0% { + transform: perspective($perspective) rotateX(180deg); + } + 100% { + transform: perspective($perspective) rotateX(0deg); + } +} +@keyframes frontFlipUp { + 0% { + transform: perspective($perspective) rotateX(0deg); + } + 100% { + transform: perspective($perspective) rotateX(180deg); + } +} +@keyframes backFlipUp { + 0% { + transform: perspective($perspective) rotateX(-180deg); + } + 100% { + transform: perspective($perspective) rotateX(0deg); + } +} +// #endregion .M-Flipper { display: inline-block; @@ -138,7 +140,7 @@ $lineColor: #ffffff; border: solid 1px $backColor; border-radius: $radius; background: $frontColor; - font-size: v-bind('`${props.width * 1.1}px`'); + font-size: $width; color: $frontColor; box-shadow: 0 0 6px rgba($color: $shadowColor, $alpha: 0.5); // 阴影部分 text-align: center; @@ -181,7 +183,7 @@ $lineColor: #ffffff; &.down .back:after { z-index: 2; transform-origin: 50% 0%; - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(180deg); + transform: perspective($perspective) rotateX(180deg); } &.down .front:after, &.down .back:before { @@ -189,12 +191,12 @@ $lineColor: #ffffff; } &.down.go .front:before { transform-origin: 50% 100%; - animation: frontFlipDown v-bind('`${props.duration / 1000}s`') ease-in-out both; + animation: frontFlipDown $speed ease-in-out both; box-shadow: 0 -2px 6px rgba($color: $lineColor, $alpha: 0.3); backface-visibility: hidden; } &.down.go .back:after { - animation: backFlipDown v-bind('`${props.duration / 1000}s`') ease-in-out both; + animation: backFlipDown $speed ease-in-out both; } /*向上翻*/ &.up .front:after { @@ -203,7 +205,7 @@ $lineColor: #ffffff; &.up .back:before { z-index: 2; transform-origin: 50% 100%; - transform: perspective(v-bind('`${props.height * 1.6}px`')) rotateX(-180deg); + transform: perspective($perspective) rotateX(-180deg); } &.up .front:before, &.up .back:after { @@ -211,12 +213,12 @@ $lineColor: #ffffff; } &.up.go .front:after { transform-origin: 50% 0; - animation: frontFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; + animation: frontFlipUp $speed ease-in-out both; box-shadow: 0 2px 6px rgba($color: $lineColor, $alpha: 0.3); backface-visibility: hidden; } &.up.go .back:before { - animation: backFlipUp v-bind('`${props.duration / 1000}s`') ease-in-out both; + animation: backFlipUp $speed ease-in-out both; } } </style> diff --git a/src/packages/components/Decorates/Mores/CountDown/config.ts b/src/packages/components/Decorates/Mores/CountDown/config.ts index daa32918..d9537fe9 100644 --- a/src/packages/components/Decorates/Mores/CountDown/config.ts +++ b/src/packages/components/Decorates/Mores/CountDown/config.ts @@ -29,8 +29,8 @@ export const option: OptionType = { endDate: new Date().getTime(), // 当前时间 style: '时分秒', showDay: false, - flipperBgColor: '#253E4E', - flipperTextColor: '#7CFFB2FF', + flipperBgColor: '#16293E', + flipperTextColor: '#4A9EF8FF', flipperWidth: 30, flipperHeight: 50, flipperRadius: 5, diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts index d7410da5..5069100b 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/config.ts +++ b/src/packages/components/Decorates/Mores/FlipperNumber/config.ts @@ -21,8 +21,8 @@ export interface OptionType { export const option: OptionType = { dataset: 3234, flipperLength: 6, - flipperBgColor: '#253E4E', - flipperTextColor: '#7CFFB2FF', + flipperBgColor: '#16293E', + flipperTextColor: '#4A9EF8FF', flipperWidth: 30, flipperHeight: 50, flipperRadius: 5, From e9e5b798e76024e5493f315a76e4d065740abf9e 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: Sat, 1 Oct 2022 17:26:52 +0800 Subject: [PATCH 35/56] =?UTF-8?q?perf:=20=E5=8E=BB=E9=99=A4=E5=B1=8F?= =?UTF-8?q?=E5=B9=95=E5=A4=A7=E5=B0=8F=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.css | 21 -------------- index.html | 3 -- .../chartHistoryStore/chartHistoryDefine.ts | 29 +++++++++---------- 3 files changed, 14 insertions(+), 39 deletions(-) diff --git a/index.css b/index.css index 2e996bd6..b93daf3b 100644 --- a/index.css +++ b/index.css @@ -82,25 +82,4 @@ to { opacity: 1; } -} - -/* 小屏处理 0~1000*/ -.mobile-terminal { - display: none; -} -@media (max-width: 1000px) { - #app { - display: none; - } - .mobile-terminal { - display: flex; - align-items: center; - justify-content: center; - width: 100vw; - height: 100vh; - text-align: center; - font-size: 24px; - font-weight: 200; - background-image: linear-gradient(to top, #fff1eb 0%, #ace0f9 100%); - } } \ No newline at end of file diff --git a/index.html b/index.html index 344d19d9..49904d92 100644 --- a/index.html +++ b/index.html @@ -24,9 +24,6 @@ </div> </div> </div> - <div class="mobile-terminal"> - <p>请使用 Web 端进行查看</p> - </div> <script type="module" src="/src/main.ts"></script> </body> </html> diff --git a/src/store/modules/chartHistoryStore/chartHistoryDefine.ts b/src/store/modules/chartHistoryStore/chartHistoryDefine.ts index 7c38de1b..edb15a3a 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryDefine.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryDefine.ts @@ -1,22 +1,21 @@ import { HistoryTargetTypeEnum, HistoryActionTypeEnum } from './chartHistoryStore.d' export const historyActionTypeName = { - [HistoryActionTypeEnum.ADD]: '新增图表', - [HistoryActionTypeEnum.DELETE]: '删除图表', - [HistoryActionTypeEnum.UPDATE]: '修改属性', - [HistoryActionTypeEnum.MOVE]: '移动图表', - [HistoryActionTypeEnum.PASTE]: '粘贴图表', - [HistoryActionTypeEnum.COPY]: '复制图表', - [HistoryActionTypeEnum.CUT]: '剪切图表', - [HistoryActionTypeEnum.TOP]: '层级置顶', - [HistoryActionTypeEnum.BOTTOM]: '层级置底', - [HistoryActionTypeEnum.UP]: '层级上移', - [HistoryActionTypeEnum.DOWN]: '层级下移', - [HistoryActionTypeEnum.GROUP]: '创建分组', - [HistoryActionTypeEnum.UN_GROUP]: '解除分组', - [HistoryActionTypeEnum.SELECT_HISTORY]: '选择记录', + [HistoryActionTypeEnum.ADD]: '新增', + [HistoryActionTypeEnum.DELETE]: '删除', + [HistoryActionTypeEnum.UPDATE]: '更新', + [HistoryActionTypeEnum.MOVE]: '移动', + [HistoryActionTypeEnum.PASTE]: '粘贴', + [HistoryActionTypeEnum.COPY]: '复制', + [HistoryActionTypeEnum.CUT]: '剪切', + [HistoryActionTypeEnum.TOP]: '置顶', + [HistoryActionTypeEnum.BOTTOM]: '置底', + [HistoryActionTypeEnum.UP]: '上移', + [HistoryActionTypeEnum.DOWN]: '下移', + [HistoryActionTypeEnum.GROUP]: '成组', + [HistoryActionTypeEnum.UN_GROUP]: '解组', [HistoryActionTypeEnum.LOCK]: '锁定', - [HistoryActionTypeEnum.UNLOCK]: '解除锁定', + [HistoryActionTypeEnum.UNLOCK]: '解锁', [HistoryActionTypeEnum.HIDE]: '隐藏', [HistoryActionTypeEnum.SHOW]: '显示', From ef7dbba3ced4c93316e08348295a62b07dbb1e06 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: Sat, 1 Oct 2022 17:27:06 +0800 Subject: [PATCH 36/56] =?UTF-8?q?style:=20=E5=8E=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/store/modules/chartHistoryStore/chartHistoryStore.d.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts b/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts index e27240bb..9ec79206 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryStore.d.ts @@ -30,8 +30,6 @@ export enum HistoryActionTypeEnum { GROUP = 'group', // 解组 UN_GROUP = 'unGroup', - // 选择历史记录 - SELECT_HISTORY = 'selectHistory', // 锁定 LOCK = 'lock', // 解除锁定 From 8d81ed38701547d8061f983c0a8704d9a29a6448 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: Sat, 1 Oct 2022 19:59:57 +0800 Subject: [PATCH 37/56] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=89=8D?= =?UTF-8?q?=E8=BF=9B=E6=92=A4=E5=9B=9E=E4=B8=AD=E9=94=81=E5=AE=9A/?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/chartEditStore/chartEditStore.ts | 74 ++++++++++--------- .../chartHistoryStore/chartHistoryStore.ts | 22 +++--- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 131e8763..5b37abfe 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -532,6 +532,10 @@ export const useChartEditStore = defineStore({ return } + // 取消选中 + this.setTargetSelectChart() + + // 重新选中 let historyData = HistoryItem.historyData as Array<CreateComponentType | CreateComponentGroupType> if (isArray(historyData)) { // 选中目标元素,支持多个 @@ -619,30 +623,36 @@ export const useChartEditStore = defineStore({ return } - switch (HistoryItem.actionType) { - // 锁定处理 - case HistoryActionTypeEnum.LOCK: - case HistoryActionTypeEnum.UNLOCK: - if (!isForward) { - // 恢复原来状态 - if (HistoryItem.actionType === HistoryActionTypeEnum.LOCK) historyData[0].status.lock = false - if (HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK) historyData[0].status.lock = true - return - } - this.setLock(!historyData[0].status.lock, false) - break + // 处理锁定 + const isLock = HistoryItem.actionType === HistoryActionTypeEnum.LOCK + const isUnLock = HistoryItem.actionType === HistoryActionTypeEnum.UNLOCK + if (isLock || isUnLock) { + if ((isLock && isForward) || (isUnLock && !isForward)) { + historyData.forEach(item => { + this.setLock(!item.status.lock, false) + }) + return + } + historyData.forEach(item => { + this.setUnLock(false) + }) + return + } - // 隐藏处理 - case HistoryActionTypeEnum.HIDE: - case HistoryActionTypeEnum.SHOW: - if (!isForward) { - // 恢复原来状态 - if (HistoryItem.actionType === HistoryActionTypeEnum.HIDE) historyData[0].status.hide = false - if (HistoryItem.actionType === HistoryActionTypeEnum.SHOW) historyData[0].status.hide = true - return - } - this.setHide(!historyData[0].status.hide, false) - break + // 处理隐藏 + const isHide = HistoryItem.actionType === HistoryActionTypeEnum.HIDE + const isShow = HistoryItem.actionType === HistoryActionTypeEnum.SHOW + if (isHide || isShow) { + if ((isHide && isForward) || (isShow && !isForward)) { + historyData.forEach(item => { + this.setHide(!item.status.hide, false) + }) + return + } + historyData.forEach(item => { + this.setShow(false) + }) + return } }, // * 撤回 @@ -837,14 +847,13 @@ export const useChartEditStore = defineStore({ // 历史记录 if (isHistory) { - chartHistoryStore.createLockHistory( - [targetItem], - status ? HistoryActionTypeEnum.LOCK : HistoryActionTypeEnum.UNLOCK - ) + status + ? chartHistoryStore.createLockHistory([targetItem]) + : chartHistoryStore.createUnLockHistory([targetItem]) } this.updateComponentList(index, targetItem) // 锁定添加失焦效果 - if(status) this.setTargetSelectChart(undefined) + if (status) this.setTargetSelectChart(undefined) loadingFinish() return } @@ -869,12 +878,11 @@ export const useChartEditStore = defineStore({ const targetItem = this.getComponentList[index] targetItem.status.hide = status - // 历史记录 + // 历史记录 if (isHistory) { - chartHistoryStore.createHideHistory( - [targetItem], - status ? HistoryActionTypeEnum.HIDE : HistoryActionTypeEnum.SHOW - ) + status + ? chartHistoryStore.createHideHistory([targetItem]) + : chartHistoryStore.createShowHistory([targetItem]) } this.updateComponentList(index, targetItem) loadingFinish() diff --git a/src/store/modules/chartHistoryStore/chartHistoryStore.ts b/src/store/modules/chartHistoryStore/chartHistoryStore.ts index b773300b..dc67ca97 100644 --- a/src/store/modules/chartHistoryStore/chartHistoryStore.ts +++ b/src/store/modules/chartHistoryStore/chartHistoryStore.ts @@ -169,18 +169,20 @@ export const useChartHistoryStore = defineStore({ this.createStackItem(item, HistoryActionTypeEnum.UN_GROUP, HistoryTargetTypeEnum.CHART) }, // * 锁定记录 - createLockHistory( - item: Array<CreateComponentType | CreateComponentGroupType>, - type: HistoryActionTypeEnum.LOCK | HistoryActionTypeEnum.UNLOCK - ) { - this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) + createLockHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { + this.createStackItem(item, HistoryActionTypeEnum.LOCK, HistoryTargetTypeEnum.CHART) + }, + // * 解锁记录 + createUnLockHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { + this.createStackItem(item, HistoryActionTypeEnum.UNLOCK, HistoryTargetTypeEnum.CHART) }, // * 隐藏记录 - createHideHistory( - item: Array<CreateComponentType | CreateComponentGroupType>, - type: HistoryActionTypeEnum.HIDE | HistoryActionTypeEnum.SHOW - ) { - this.createStackItem(item, type, HistoryTargetTypeEnum.CHART) + createHideHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { + this.createStackItem(item, HistoryActionTypeEnum.HIDE, HistoryTargetTypeEnum.CHART) + }, + // * 展示记录 + createShowHistory(item: Array<CreateComponentType | CreateComponentGroupType>) { + this.createStackItem(item, HistoryActionTypeEnum.SHOW, HistoryTargetTypeEnum.CHART) } } }) From 9161374320e900893a528283c58cee3452422743 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: Sat, 1 Oct 2022 20:34:24 +0800 Subject: [PATCH 38/56] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E9=BB=98=E8=AE=A4=E5=B1=95=E7=A4=BA=EF=BC=8C=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/settings/designColor.json | 6827 ++++-------------------- src/settings/designColorRecommend.json | 66 +- 2 files changed, 1066 insertions(+), 5827 deletions(-) diff --git a/src/settings/designColor.json b/src/settings/designColor.json index 5e506ba4..77ddf15d 100644 --- a/src/settings/designColor.json +++ b/src/settings/designColor.json @@ -1,8402 +1,3677 @@ [ { - "CMYK": [ - 4, - 5, - 18, - 0 - ], - "RGB": [ - 249, - 244, - 220 - ], + "CMYK": [4, 5, 18, 0], + "RGB": [249, 244, 220], "hex": "#f9f4dc", "name": "乳白", "pinyin": "rubai" }, { - "CMYK": [ - 3, - 8, - 30, - 0 - ], - "RGB": [ - 249, - 236, - 195 - ], + "CMYK": [3, 8, 30, 0], + "RGB": [249, 236, 195], "hex": "#f7e8aa", "name": "杏仁黄", "pinyin": "xingrenhuang" }, { - "CMYK": [ - 4, - 13, - 67, - 0 - ], - "RGB": [ - 248, - 223, - 114 - ], + "CMYK": [4, 13, 67, 0], + "RGB": [248, 223, 114], "hex": "#f8df72", "name": "茉莉黄", "pinyin": "molihuang" }, { - "CMYK": [ - 5, - 14, - 68, - 1 - ], - "RGB": [ - 248, - 223, - 112 - ], + "CMYK": [5, 14, 68, 1], + "RGB": [248, 223, 112], "hex": "#f8df70", "name": "麦秆黄", "pinyin": "maiganhuang" }, { - "CMYK": [ - 2, - 16, - 84, - 0 - ], - "RGB": [ - 251, - 218, - 65 - ], + "CMYK": [2, 16, 84, 0], + "RGB": [251, 218, 65], "hex": "#fbda41", "name": "油菜花黄", "pinyin": "youcaihuahuang" }, { - "CMYK": [ - 1, - 18, - 94, - 0 - ], - "RGB": [ - 254, - 215, - 26 - ], + "CMYK": [1, 18, 94, 0], + "RGB": [254, 215, 26], "hex": "#fed71a", "name": "佛手黄", "pinyin": "foshouhuang" }, { - "CMYK": [ - 3, - 16, - 50, - 0 - ], - "RGB": [ - 247, - 222, - 152 - ], + "CMYK": [3, 16, 50, 0], + "RGB": [247, 222, 152], "hex": "#f7de98", "name": "篾黄", "pinyin": "miehuang" }, { - "CMYK": [ - 3, - 17, - 69, - 0 - ], - "RGB": [ - 248, - 216, - 106 - ], + "CMYK": [3, 17, 69, 0], + "RGB": [248, 216, 106], "hex": "#f8d86a", "name": "葵扇黄", "pinyin": "kuishanhuang" }, { - "CMYK": [ - 0, - 20, - 87, - 0 - ], - "RGB": [ - 252, - 211, - 55 - ], + "CMYK": [0, 20, 87, 0], + "RGB": [252, 211, 55], "hex": "#fcd337", "name": "柠檬黄", "pinyin": "ningmenghuang" }, { - "CMYK": [ - 0, - 20, - 95, - 0 - ], - "RGB": [ - 252, - 210, - 23 - ], + "CMYK": [0, 20, 95, 0], + "RGB": [252, 210, 23], "hex": "#fcd217", "name": "金瓜黄", "pinyin": "jinguahuang" }, { - "CMYK": [ - 0, - 21, - 94, - 0 - ], - "RGB": [ - 254, - 209, - 16 - ], + "CMYK": [0, 21, 94, 0], + "RGB": [254, 209, 16], "hex": "#ffd111", "name": "藤黄", "pinyin": "tenghuang" }, { - "CMYK": [ - 2, - 16, - 39, - 0 - ], - "RGB": [ - 246, - 222, - 173 - ], + "CMYK": [2, 16, 39, 0], + "RGB": [246, 222, 173], "hex": "#f6dead", "name": "酪黄", "pinyin": "laohuang" }, { - "CMYK": [ - 1, - 21, - 70, - 0 - ], - "RGB": [ - 249, - 211, - 103 - ], + "CMYK": [1, 21, 70, 0], + "RGB": [249, 211, 103], "hex": "#f9d367", "name": "淡密黄", "pinyin": "danmihuang" }, { - "CMYK": [ - 0, - 23, - 88, - 0 - ], - "RGB": [ - 251, - 205, - 49 - ], + "CMYK": [0, 23, 88, 0], + "RGB": [251, 205, 49], "hex": "#fbcd31", "name": "大豆黄", "pinyin": "dadouhuang" }, { - "CMYK": [ - 0, - 24, - 94, - 0 - ], - "RGB": [ - 252, - 203, - 22 - ], + "CMYK": [0, 24, 94, 0], + "RGB": [252, 203, 22], "hex": "#fccb16", "name": "素馨黄", "pinyin": "suxinhuang" }, { - "CMYK": [ - 0, - 24, - 94, - 0 - ], - "RGB": [ - 254, - 204, - 17 - ], + "CMYK": [0, 24, 94, 0], + "RGB": [254, 204, 17], "hex": "#fecc11", "name": "向日葵黄", "pinyin": "xiangrikuihuang" }, { - "CMYK": [ - 0, - 27, - 88, - 0 - ], - "RGB": [ - 251, - 200, - 47 - ], + "CMYK": [0, 27, 88, 0], + "RGB": [251, 200, 47], "hex": "#fbc82f", "name": "雅梨黄", "pinyin": "yalihuang" }, { - "CMYK": [ - 0, - 28, - 94, - 0 - ], - "RGB": [ - 252, - 197, - 21 - ], + "CMYK": [0, 28, 94, 0], + "RGB": [252, 197, 21], "hex": "#fcc515", "name": "黄连黄", "pinyin": "huanglianhuang" }, { - "CMYK": [ - 0, - 29, - 95, - 0 - ], - "RGB": [ - 252, - 195, - 7 - ], + "CMYK": [0, 29, 95, 0], + "RGB": [252, 195, 7], "hex": "#fcc307", "name": "金盏黄", "pinyin": "jinzhanhuang" }, { - "CMYK": [ - 0, - 32, - 52, - 0 - ], - "RGB": [ - 248, - 195, - 135 - ], + "CMYK": [0, 32, 52, 0], + "RGB": [248, 195, 135], "hex": "#f8c387", "name": "蛋壳黄", "pinyin": "dankehuang" }, { - "CMYK": [ - 0, - 32, - 52, - 0 - ], - "RGB": [ - 247, - 193, - 115 - ], + "CMYK": [0, 32, 52, 0], + "RGB": [247, 193, 115], "hex": "#f7c173", "name": "肉色", "pinyin": "rouse" }, { - "CMYK": [ - 0, - 35, - 89, - 0 - ], - "RGB": [ - 251, - 185, - 41 - ], + "CMYK": [0, 35, 89, 0], + "RGB": [251, 185, 41], "hex": "#fbb929", "name": "鹅掌黄", "pinyin": "ezhanghuang" }, { - "CMYK": [ - 0, - 36, - 93, - 0 - ], - "RGB": [ - 251, - 182, - 18 - ], + "CMYK": [0, 36, 93, 0], + "RGB": [251, 182, 18], "hex": "#fbb612", "name": "鸡蛋黄", "pinyin": "jidanhuang" }, { - "CMYK": [ - 0, - 35, - 94, - 0 - ], - "RGB": [ - 252, - 183, - 10 - ], + "CMYK": [0, 35, 94, 0], + "RGB": [252, 183, 10], "hex": "#fcb70a", "name": "鼬黄", "pinyin": "youhuang" }, { - "CMYK": [ - 0, - 44, - 84, - 0 - ], - "RGB": [ - 249, - 166, - 51 - ], + "CMYK": [0, 44, 84, 0], + "RGB": [249, 166, 51], "hex": "#f9a633", "name": "榴萼黄", "pinyin": "liuehuang" }, { - "CMYK": [ - 0, - 45, - 92, - 0 - ], - "RGB": [ - 251, - 164, - 20 - ], + "CMYK": [0, 45, 92, 0], + "RGB": [251, 164, 20], "hex": "#fba414", "name": "淡橘橙", "pinyin": "danjucheng" }, { - "CMYK": [ - 0, - 47, - 92, - 0 - ], - "RGB": [ - 252, - 161, - 6 - ], + "CMYK": [0, 47, 92, 0], + "RGB": [252, 161, 6], "hex": "#fca106", "name": "枇杷黄", "pinyin": "pipahuang" }, { - "CMYK": [ - 0, - 47, - 92, - 0 - ], - "RGB": [ - 252, - 161, - 4 - ], + "CMYK": [0, 47, 92, 0], + "RGB": [252, 161, 4], "hex": "#fca104", "name": "橙皮黄", "pinyin": "chengpihuang" }, { - "CMYK": [ - 0, - 56, - 87, - 0 - ], - "RGB": [ - 252, - 140, - 35 - ], + "CMYK": [0, 56, 87, 0], + "RGB": [252, 140, 35], "hex": "#fc8c23", "name": "北瓜黄", "pinyin": "beiguahuang" }, { - "CMYK": [ - 0, - 54, - 92, - 0 - ], - "RGB": [ - 250, - 142, - 22 - ], + "CMYK": [0, 54, 92, 0], + "RGB": [250, 142, 22], "hex": "#f28e16", "name": "杏黄", "pinyin": "xinghuang" }, { - "CMYK": [ - 0, - 51, - 91, - 0 - ], - "RGB": [ - 255, - 153, - 0 - ], + "CMYK": [0, 51, 91, 0], + "RGB": [255, 153, 0], "hex": "#ff9900", "name": "雄黄", "pinyin": "xionghuang" }, { - "CMYK": [ - 0, - 56, - 91, - 0 - ], - "RGB": [ - 251, - 139, - 5 - ], + "CMYK": [0, 56, 91, 0], + "RGB": [251, 139, 5], "hex": "#fb8b05", "name": "万寿菊黄", "pinyin": "wanshoujuhuang" }, { - "CMYK": [ - 10, - 13, - 35, - 1 - ], - "RGB": [ - 233, - 221, - 182 - ], + "CMYK": [10, 13, 35, 1], + "RGB": [233, 221, 182], "hex": "#e9ddb6", "name": "菊蕾白", "pinyin": "juleibai" }, { - "CMYK": [ - 8, - 19, - 84, - 1 - ], - "RGB": [ - 238, - 208, - 69 - ], + "CMYK": [8, 19, 84, 1], + "RGB": [238, 208, 69], "hex": "#eed045", "name": "秋葵黄", "pinyin": "qiukuihuang" }, { - "CMYK": [ - 6, - 20, - 92, - 1 - ], - "RGB": [ - 242, - 206, - 43 - ], + "CMYK": [6, 20, 92, 1], + "RGB": [242, 206, 43], "hex": "#f2ce2b", "name": "硫华黄", "pinyin": "liuhuahuang" }, { - "CMYK": [ - 6, - 22, - 92, - 0 - ], - "RGB": [ - 241, - 202, - 23 - ], + "CMYK": [6, 22, 92, 0], + "RGB": [241, 202, 23], "hex": "#f1ca17", "name": "柚黄", "pinyin": "youhuang" }, { - "CMYK": [ - 15, - 20, - 66, - 2 - ], - "RGB": [ - 221, - 200, - 113 - ], + "CMYK": [15, 20, 66, 2], + "RGB": [221, 200, 113], "hex": "#ddc871", "name": "芒果黄", "pinyin": "mangguohuang" }, { - "CMYK": [ - 14, - 22, - 85, - 2 - ], - "RGB": [ - 223, - 194, - 67 - ], + "CMYK": [14, 22, 85, 2], + "RGB": [223, 194, 67], "hex": "#dfc243", "name": "蒿黄", "pinyin": "haohuang" }, { - "CMYK": [ - 12, - 24, - 95, - 2 - ], - "RGB": [ - 226, - 192, - 39 - ], + "CMYK": [12, 24, 95, 2], + "RGB": [226, 192, 39], "hex": "#e2c027", "name": "姜黄", "pinyin": "jianghuang" }, { - "CMYK": [ - 11, - 25, - 99, - 1 - ], - "RGB": [ - 228, - 191, - 17 - ], + "CMYK": [11, 25, 99, 1], + "RGB": [228, 191, 17], "hex": "#e4bf11", "name": "香蕉黄", "pinyin": "xiangjiaohuang" }, { - "CMYK": [ - 17, - 27, - 94, - 4 - ], - "RGB": [ - 210, - 180, - 44 - ], + "CMYK": [17, 27, 94, 4], + "RGB": [210, 180, 44], "hex": "#d2b42c", "name": "草黄", "pinyin": "caohuang" }, { - "CMYK": [ - 17, - 29, - 100, - 4 - ], - "RGB": [ - 210, - 177, - 22 - ], + "CMYK": [17, 29, 100, 4], + "RGB": [210, 177, 22], "hex": "#d2b116", "name": "新禾绿", "pinyin": "xinhelv" }, { - "CMYK": [ - 28, - 26, - 45, - 7 - ], - "RGB": [ - 183, - 174, - 143 - ], + "CMYK": [28, 26, 45, 7], + "RGB": [183, 174, 143], "hex": "#b7ae8f", "name": "月灰", "pinyin": "yuehui" }, { - "CMYK": [ - 30, - 30, - 70, - 12 - ], - "RGB": [ - 173, - 158, - 85 - ], + "CMYK": [30, 30, 70, 12], + "RGB": [173, 158, 85], "hex": "#ad9e5f", "name": "淡灰绿", "pinyin": "danhuilv" }, { - "CMYK": [ - 38, - 38, - 76, - 24 - ], - "RGB": [ - 142, - 128, - 75 - ], + "CMYK": [38, 38, 76, 24], + "RGB": [142, 128, 75], "hex": "#8e804b", "name": "草灰绿", "pinyin": "caohuilv" }, { - "CMYK": [ - 36, - 42, - 100, - 29 - ], - "RGB": [ - 136, - 115, - 34 - ], + "CMYK": [36, 42, 100, 29], + "RGB": [136, 115, 34], "hex": "#887322", "name": "苔绿", "pinyin": "tailv" }, { - "CMYK": [ - 36, - 42, - 100, - 30 - ], - "RGB": [ - 134, - 112, - 24 - ], + "CMYK": [36, 42, 100, 30], + "RGB": [134, 112, 24], "hex": "#867018", "name": "碧螺春绿", "pinyin": "biluochunlv" }, { - "CMYK": [ - 47, - 47, - 65, - 42 - ], - "RGB": [ - 104, - 94, - 72 - ], + "CMYK": [47, 47, 65, 42], + "RGB": [104, 94, 72], "hex": "#685e48", "name": "燕羽灰", "pinyin": "yanyuhui" }, { - "CMYK": [ - 46, - 47, - 69, - 42 - ], - "RGB": [ - 105, - 94, - 69 - ], + "CMYK": [46, 47, 69, 42], + "RGB": [105, 94, 69], "hex": "#695e45", "name": "蟹壳灰", "pinyin": "xiekehui" }, { - "CMYK": [ - 48, - 48, - 100, - 45 - ], - "RGB": [ - 100, - 88, - 34 - ], + "CMYK": [48, 48, 100, 45], + "RGB": [100, 88, 34], "hex": "#645822", "name": "潭水绿", "pinyin": "tanshuilv" }, { - "CMYK": [ - 50, - 50, - 10, - 48 - ], - "RGB": [ - 94, - 83, - 20 - ], + "CMYK": [50, 50, 10, 48], + "RGB": [94, 83, 20], "hex": "#5e5314", "name": "橄榄绿", "pinyin": "ganlanlv" }, { - "CMYK": [ - 2, - 6, - 18, - 0 - ], - "RGB": [ - 249, - 241, - 219 - ], + "CMYK": [2, 6, 18, 0], + "RGB": [249, 241, 219], "hex": "#f9f1db", "name": "蚌肉白", "pinyin": "bangroubai" }, { - "CMYK": [ - 3, - 10, - 31, - 0 - ], - "RGB": [ - 248, - 232, - 193 - ], + "CMYK": [3, 10, 31, 0], + "RGB": [248, 232, 193], "hex": "#f8e8c1", "name": "豆汁黄", "pinyin": "douzhihuang" }, { - "CMYK": [ - 1, - 19, - 66, - 0 - ], - "RGB": [ - 249, - 215, - 112 - ], + "CMYK": [1, 19, 66, 0], + "RGB": [249, 215, 112], "hex": "#f9d770", "name": "淡茧黄", "pinyin": "danjianhuang" }, { - "CMYK": [ - 0, - 26, - 94, - 0 - ], - "RGB": [ - 255, - 201, - 12 - ], + "CMYK": [0, 26, 94, 0], + "RGB": [255, 201, 12], "hex": "#ffc90c", "name": "乳鸭黄", "pinyin": "ruyahuang" }, { - "CMYK": [ - 5, - 11, - 22, - 0 - ], - "RGB": [ - 242, - 230, - 206 - ], + "CMYK": [5, 11, 22, 0], + "RGB": [242, 230, 206], "hex": "#f2e6ce", "name": "荔肉白", "pinyin": "liroubai" }, { - "CMYK": [ - 5, - 19, - 50, - 0 - ], - "RGB": [ - 240, - 214, - 149 - ], + "CMYK": [5, 19, 50, 0], + "RGB": [240, 214, 149], "hex": "#f0d695", "name": "象牙黄", "pinyin": "xiangyahuang" }, { - "CMYK": [ - 3, - 23, - 69, - 0 - ], - "RGB": [ - 244, - 206, - 105 - ], + "CMYK": [3, 23, 69, 0], + "RGB": [244, 206, 105], "hex": "#f4ce69", "name": "炒米黄", "pinyin": "chaomihuang" }, { - "CMYK": [ - 1, - 28, - 89, - 0 - ], - "RGB": [ - 246, - 196, - 48 - ], + "CMYK": [1, 28, 89, 0], + "RGB": [246, 196, 48], "hex": "#f6c430", "name": "鹦鹉冠黄", "pinyin": "yingwuguanhuang" }, { - "CMYK": [ - 0, - 30, - 95, - 0 - ], - "RGB": [ - 249, - 193, - 22 - ], + "CMYK": [0, 30, 95, 0], + "RGB": [249, 193, 22], "hex": "#f9c116", "name": "木瓜黄", "pinyin": "muguahuang" }, { - "CMYK": [ - 0, - 32, - 95, - 0 - ], - "RGB": [ - 249, - 189, - 16 - ], + "CMYK": [0, 32, 95, 0], + "RGB": [249, 189, 16], "hex": "#f9bd10", "name": "浅烙黄", "pinyin": "qianlaohuang" }, { - "CMYK": [ - 11, - 18, - 39, - 1 - ], - "RGB": [ - 229, - 211, - 170 - ], + "CMYK": [11, 18, 39, 1], + "RGB": [229, 211, 170], "hex": "#e5d3aa", "name": "莲子白", "pinyin": "lianzibai" }, { - "CMYK": [ - 5, - 35, - 99, - 0 - ], - "RGB": [ - 232, - 176, - 4 - ], + "CMYK": [5, 35, 99, 0], + "RGB": [232, 176, 4], "hex": "#e8b004", "name": "谷黄", "pinyin": "guhuang" }, { - "CMYK": [ - 3, - 36, - 99, - 0 - ], - "RGB": [ - 235, - 177, - 13 - ], + "CMYK": [3, 36, 99, 0], + "RGB": [235, 177, 13], "hex": "#ebb10d", "name": "栀子黄", "pinyin": "zhizihuang" }, { - "CMYK": [ - 11, - 39, - 100, - 2 - ], - "RGB": [ - 217, - 164, - 14 - ], + "CMYK": [11, 39, 100, 2], + "RGB": [217, 164, 14], "hex": "#d9a40e", "name": "芥黄", "pinyin": "jiehuang" }, { - "CMYK": [ - 28, - 27, - 43, - 8 - ], - "RGB": [ - 181, - 170, - 144 - ], + "CMYK": [28, 27, 43, 8], + "RGB": [181, 170, 144], "hex": "#b5aa90", "name": "银鼠灰", "pinyin": "yinshuhui" }, { - "CMYK": [ - 26, - 31, - 57, - 10 - ], - "RGB": [ - 182, - 164, - 118 - ], + "CMYK": [26, 31, 57, 10], + "RGB": [182, 164, 118], "hex": "#b6a476", "name": "尘灰", "pinyin": "chenhui" }, { - "CMYK": [ - 21, - 43, - 100, - 11 - ], - "RGB": [ - 183, - 141, - 18 - ], + "CMYK": [21, 43, 100, 11], + "RGB": [183, 141, 18], "hex": "#b78d12", "name": "枯绿", "pinyin": "kulv" }, { - "CMYK": [ - 35, - 44, - 80, - 30 - ], - "RGB": [ - 135, - 114, - 62 - ], + "CMYK": [35, 44, 80, 30], + "RGB": [135, 114, 62], "hex": "#87723e", "name": "鲛青", "pinyin": "jiaoqing" }, { - "CMYK": [ - 32, - 50, - 100, - 31 - ], - "RGB": [ - 135, - 104, - 24 - ], + "CMYK": [32, 50, 100, 31], + "RGB": [135, 104, 24], "hex": "#876818", "name": "粽叶绿", "pinyin": "zongyelv" }, { - "CMYK": [ - 31, - 51, - 100, - 30 - ], - "RGB": [ - 138, - 105, - 19 - ], + "CMYK": [31, 51, 100, 30], + "RGB": [138, 105, 19], "hex": "#8a6913", "name": "灰绿", "pinyin": "huilv" }, { - "CMYK": [ - 52, - 56, - 64, - 62 - ], - "RGB": [ - 74, - 64, - 53 - ], + "CMYK": [52, 56, 64, 62], + "RGB": [74, 64, 53], "hex": "#4a4035", "name": "鹤灰", "pinyin": "hehui" }, { - "CMYK": [ - 48, - 58, - 70, - 62 - ], - "RGB": [ - 77, - 64, - 48 - ], + "CMYK": [48, 58, 70, 62], + "RGB": [77, 64, 48], "hex": "#4d4030", "name": "淡松烟", "pinyin": "dansongyan" }, { - "CMYK": [ - 45, - 56, - 100, - 56 - ], - "RGB": [ - 88, - 71, - 23 - ], + "CMYK": [45, 56, 100, 56], + "RGB": [88, 71, 23], "hex": "#584717", "name": "暗海水绿", "pinyin": "anhaishuilv" }, { - "CMYK": [ - 45, - 55, - 100, - 54 - ], - "RGB": [ - 91, - 73, - 19 - ], + "CMYK": [45, 55, 100, 54], + "RGB": [91, 73, 19], "hex": "#5b4913", "name": "棕榈绿", "pinyin": "zonglvlv" }, { - "CMYK": [ - 1, - 11, - 24, - 0 - ], - "RGB": [ - 249, - 223, - 205 - ], + "CMYK": [1, 11, 24, 0], + "RGB": [249, 223, 205], "hex": "#f9e9cd", "name": "米色", "pinyin": "mise" }, { - "CMYK": [ - 1, - 15, - 38, - 0 - ], - "RGB": [ - 248, - 224, - 176 - ], + "CMYK": [1, 15, 38, 0], + "RGB": [248, 224, 176], "hex": "#f8e0b0", "name": "淡肉色", "pinyin": "danrouse" }, { - "CMYK": [ - 0, - 23, - 59, - 0 - ], - "RGB": [ - 249, - 210, - 125 - ], + "CMYK": [0, 23, 59, 0], + "RGB": [249, 210, 125], "hex": "#f9d27d", "name": "麦芽糖黄", "pinyin": "maiyatanghuang" }, { - "CMYK": [ - 0, - 34, - 93, - 0 - ], - "RGB": [ - 254, - 186, - 7 - ], + "CMYK": [0, 34, 93, 0], + "RGB": [254, 186, 7], "hex": "#feba07", "name": "琥珀黄", "pinyin": "hupohuang" }, { - "CMYK": [ - 1, - 31, - 79, - 0 - ], - "RGB": [ - 243, - 191, - 76 - ], + "CMYK": [1, 31, 79, 0], + "RGB": [243, 191, 76], "hex": "#f3bf4c", "name": "甘草黄", "pinyin": "gancaohuang" }, { - "CMYK": [ - 0, - 33, - 83, - 0 - ], - "RGB": [ - 248, - 188, - 49 - ], + "CMYK": [0, 33, 83, 0], + "RGB": [248, 188, 49], "hex": "#f8bc31", "name": "初熟杏黄", "pinyin": "chushuxinghuang" }, { - "CMYK": [ - 10, - 27, - 59, - 1 - ], - "RGB": [ - 226, - 193, - 124 - ], + "CMYK": [10, 27, 59, 1], + "RGB": [226, 193, 124], "hex": "#e2c17c", "name": "浅驼色", "pinyin": "qiantuose" }, { - "CMYK": [ - 7, - 32, - 78, - 1 - ], - "RGB": [ - 229, - 183, - 81 - ], + "CMYK": [7, 32, 78, 1], + "RGB": [229, 183, 81], "hex": "#e5b751", "name": "沙石黄", "pinyin": "shashihuang" }, { - "CMYK": [ - 3, - 38, - 97, - 0 - ], - "RGB": [ - 234, - 173, - 26 - ], + "CMYK": [3, 38, 97, 0], + "RGB": [234, 173, 26], "hex": "#eaad1a", "name": "虎皮黄", "pinyin": "hupihuang" }, { - "CMYK": [ - 12, - 41, - 98, - 2 - ], - "RGB": [ - 214, - 160, - 29 - ], + "CMYK": [12, 41, 98, 2], + "RGB": [214, 160, 29], "hex": "#d6a01d", "name": "土黄", "pinyin": "tuhuang" }, { - "CMYK": [ - 28, - 28, - 41, - 9 - ], - "RGB": [ - 180, - 169, - 146 - ], + "CMYK": [28, 28, 41, 9], + "RGB": [180, 169, 146], "hex": "#b4a992", "name": "百灵鸟灰", "pinyin": "bailingniaohui" }, { - "CMYK": [ - 21, - 44, - 97, - 11 - ], - "RGB": [ - 183, - 139, - 38 - ], + "CMYK": [21, 44, 97, 11], + "RGB": [183, 139, 38], "hex": "#b78b26", "name": "山鸡黄", "pinyin": "shanjihuang" }, { - "CMYK": [ - 35, - 47, - 71, - 33 - ], - "RGB": [ - 130, - 107, - 72 - ], + "CMYK": [35, 47, 71, 33], + "RGB": [130, 107, 72], "hex": "#826b48", "name": "龟背黄", "pinyin": "guibeihuang" }, { - "CMYK": [ - 34, - 52, - 85, - 35 - ], - "RGB": [ - 128, - 99, - 50 - ], + "CMYK": [34, 52, 85, 35], + "RGB": [128, 99, 50], "hex": "#806332", "name": "苍黄", "pinyin": "canghuang" }, { - "CMYK": [ - 32, - 56, - 96, - 34 - ], - "RGB": [ - 129, - 95, - 37 - ], + "CMYK": [32, 56, 96, 34], + "RGB": [129, 95, 37], "hex": "#815f25", "name": "莱阳梨黄", "pinyin": "laiyanglihuang" }, { - "CMYK": [ - 31, - 57, - 100, - 33 - ], - "RGB": [ - 131, - 94, - 29 - ], + "CMYK": [31, 57, 100, 33], + "RGB": [131, 94, 29], "hex": "#835e1d", "name": "蜴蜊绿", "pinyin": "yililv" }, { - "CMYK": [ - 46, - 59, - 68, - 61 - ], - "RGB": [ - 79, - 64, - 50 - ], + "CMYK": [46, 59, 68, 61], + "RGB": [79, 64, 50], "hex": "#4f4032", "name": "松鼠灰", "pinyin": "songshuhui" }, { - "CMYK": [ - 44, - 61, - 76, - 62 - ], - "RGB": [ - 80, - 62, - 42 - ], + "CMYK": [44, 61, 76, 62], + "RGB": [80, 62, 42], "hex": "#503e2a", "name": "橄榄灰", "pinyin": "ganlanhui" }, { - "CMYK": [ - 43, - 63, - 88, - 61 - ], - "RGB": [ - 81, - 60, - 32 - ], + "CMYK": [43, 63, 88, 61], + "RGB": [81, 60, 32], "hex": "#513c20", "name": "蟹壳绿", "pinyin": "xiekelv" }, { - "CMYK": [ - 42, - 64, - 94, - 60 - ], - "RGB": [ - 83, - 60, - 27 - ], + "CMYK": [42, 64, 94, 60], + "RGB": [83, 60, 27], "hex": "#533c1b", "name": "古铜绿", "pinyin": "gutonglv" }, { - "CMYK": [ - 41, - 66, - 94, - 60 - ], - "RGB": [ - 85, - 59, - 24 - ], + "CMYK": [41, 66, 94, 60], + "RGB": [85, 59, 24], "hex": "#553b18", "name": "焦茶绿", "pinyin": "jiaochalv" }, { - "CMYK": [ - 1, - 7, - 13, - 0 - ], - "RGB": [ - 251, - 242, - 227 - ], + "CMYK": [1, 7, 13, 0], + "RGB": [251, 242, 227], "hex": "#fbf2e3", "name": "粉白", "pinyin": "fenbai" }, { - "CMYK": [ - 1, - 12, - 22, - 0 - ], - "RGB": [ - 249, - 232, - 208 - ], + "CMYK": [1, 12, 22, 0], + "RGB": [249, 232, 208], "hex": "#f9e8d0", "name": "落英淡粉", "pinyin": "luoyingdanfen" }, { - "CMYK": [ - 0, - 27, - 51, - 0 - ], - "RGB": [ - 249, - 203, - 139 - ], + "CMYK": [0, 27, 51, 0], + "RGB": [249, 203, 139], "hex": "#f9cb8b", "name": "瓜瓤粉", "pinyin": "guarangfen" }, { - "CMYK": [ - 0, - 36, - 72, - 0 - ], - "RGB": [ - 251, - 185, - 87 - ], + "CMYK": [0, 36, 72, 0], + "RGB": [251, 185, 87], "hex": "#fbb957", "name": "蜜黄", "pinyin": "mihuang" }, { - "CMYK": [ - 0, - 44, - 91, - 0 - ], - "RGB": [ - 255, - 166, - 15 - ], + "CMYK": [0, 44, 91, 0], + "RGB": [255, 166, 15], "hex": "#ffa60f", "name": "金叶黄", "pinyin": "jinyehuang" }, { - "CMYK": [ - 0, - 43, - 82, - 0 - ], - "RGB": [ - 244, - 168, - 58 - ], + "CMYK": [0, 43, 82, 0], + "RGB": [244, 168, 58], "hex": "#f4a83a", "name": "金莺黄", "pinyin": "jinyinghuang" }, { - "CMYK": [ - 8, - 31, - 50, - 1 - ], - "RGB": [ - 227, - 189, - 141 - ], + "CMYK": [8, 31, 50, 1], + "RGB": [227, 189, 141], "hex": "#e3bd8d", "name": "鹿角棕", "pinyin": "lujiaozong" }, { - "CMYK": [ - 2, - 44, - 83, - 0 - ], - "RGB": [ - 231, - 162, - 63 - ], + "CMYK": [2, 44, 83, 0], + "RGB": [231, 162, 63], "hex": "#e7a23f", "name": "凋叶棕", "pinyin": "diaoyezong" }, { - "CMYK": [ - 10, - 41, - 72, - 1 - ], - "RGB": [ - 218, - 164, - 90 - ], + "CMYK": [10, 41, 72, 1], + "RGB": [218, 164, 90], "hex": "#daa45a", "name": "玳瑁黄", "pinyin": "daimaohuang" }, { - "CMYK": [ - 7, - 45, - 82, - 1 - ], - "RGB": [ - 222, - 158, - 68 - ], + "CMYK": [7, 45, 82, 1], + "RGB": [222, 158, 68], "hex": "#de9e44", "name": "软木黄", "pinyin": "ruanmuhuang" }, { - "CMYK": [ - 6, - 51, - 95, - 1 - ], - "RGB": [ - 220, - 145, - 35 - ], + "CMYK": [6, 51, 95, 1], + "RGB": [220, 145, 35], "hex": "#dc9123", "name": "风帆黄", "pinyin": "fengfanhuang" }, { - "CMYK": [ - 19, - 44, - 75, - 7 - ], - "RGB": [ - 192, - 147, - 81 - ], + "CMYK": [19, 44, 75, 7], + "RGB": [192, 147, 81], "hex": "#c09351", "name": "桂皮淡棕", "pinyin": "guipidanzong" }, { - "CMYK": [ - 32, - 40, - 53, - 22 - ], - "RGB": [ - 151, - 132, - 108 - ], + "CMYK": [32, 40, 53, 22], + "RGB": [151, 132, 108], "hex": "#97846c", "name": "猴毛灰", "pinyin": "houmaohui" }, { - "CMYK": [ - 27, - 60, - 97, - 21 - ], - "RGB": [ - 152, - 101, - 36 - ], + "CMYK": [27, 60, 97, 21], + "RGB": [152, 101, 36], "hex": "#986524", "name": "山鸡褐", "pinyin": "shanjihe" }, { - "CMYK": [ - 37, - 65, - 84, - 49 - ], - "RGB": [ - 102, - 70, - 42 - ], + "CMYK": [37, 65, 84, 49], + "RGB": [102, 70, 42], "hex": "#66462a", "name": "驼色", "pinyin": "tuose" }, { - "CMYK": [ - 38, - 69, - 90, - 54 - ], - "RGB": [ - 93, - 61, - 33 - ], + "CMYK": [38, 69, 90, 54], + "RGB": [93, 61, 33], "hex": "#5d3d21", "name": "茶褐", "pinyin": "chahe" }, { - "CMYK": [ - 37, - 74, - 96, - 55 - ], - "RGB": [ - 92, - 55, - 25 - ], + "CMYK": [37, 74, 96, 55], + "RGB": [92, 55, 25], "hex": "#5c3719", "name": "古铜褐", "pinyin": "gutonghe" }, { - "CMYK": [ - 0, - 10, - 14, - 0 - ], - "RGB": [ - 251, - 236, - 222 - ], + "CMYK": [0, 10, 14, 0], + "RGB": [251, 236, 222], "hex": "#fbecde", "name": "荷花白", "pinyin": "hehuabai" }, { - "CMYK": [ - 0, - 40, - 52, - 0 - ], - "RGB": [ - 248, - 179, - 127 - ], + "CMYK": [0, 40, 52, 0], + "RGB": [248, 179, 127], "hex": "#f8b37f", "name": "玫瑰粉", "pinyin": "meiguifen" }, { - "CMYK": [ - 0, - 62, - 88, - 0 - ], - "RGB": [ - 249, - 125, - 28 - ], + "CMYK": [0, 62, 88, 0], + "RGB": [249, 125, 28], "hex": "#f97d1c", "name": "橘橙", "pinyin": "jucheng" }, { - "CMYK": [ - 0, - 62, - 85, - 0 - ], - "RGB": [ - 250, - 126, - 35 - ], + "CMYK": [0, 62, 85, 0], + "RGB": [250, 126, 35], "hex": "#fa7e23", "name": "美人焦橙", "pinyin": "meirenjiaocheng" }, { - "CMYK": [ - 0, - 28, - 25, - 0 - ], - "RGB": [ - 247, - 205, - 188 - ], + "CMYK": [0, 28, 25, 0], + "RGB": [247, 205, 188], "hex": "#f7cdbc", "name": "润红", "pinyin": "runhong" }, { - "CMYK": [ - 0, - 28, - 22, - 0 - ], - "RGB": [ - 246, - 206, - 193 - ], + "CMYK": [0, 28, 22, 0], + "RGB": [246, 206, 193], "hex": "#f6cec1", "name": "淡桃红", "pinyin": "dantaohong" }, { - "CMYK": [ - 0, - 53, - 65, - 0 - ], - "RGB": [ - 240, - 148, - 93 - ], + "CMYK": [0, 53, 65, 0], + "RGB": [240, 148, 93], "hex": "#f0945d", "name": "海螺橙", "pinyin": "hailuocheng" }, { - "CMYK": [ - 0, - 44, - 32, - 0 - ], - "RGB": [ - 240, - 173, - 160 - ], + "CMYK": [0, 44, 32, 0], + "RGB": [240, 173, 160], "hex": "#f0ada0", "name": "桃红", "pinyin": "taohong" }, { - "CMYK": [ - 0, - 45, - 34, - 0 - ], - "RGB": [ - 238, - 170, - 156 - ], + "CMYK": [0, 45, 34, 0], + "RGB": [238, 170, 156], "hex": "#eeaa9c", "name": "颊红", "pinyin": "jiahong" }, { - "CMYK": [ - 0, - 49, - 41, - 0 - ], - "RGB": [ - 238, - 160, - 140 - ], + "CMYK": [0, 49, 41, 0], + "RGB": [238, 160, 140], "hex": "#eea08c", "name": "淡罂粟红", "pinyin": "danyingsuhong" }, { - "CMYK": [ - 0, - 58, - 67, - 0 - ], - "RGB": [ - 234, - 137, - 88 - ], + "CMYK": [0, 58, 67, 0], + "RGB": [234, 137, 88], "hex": "#ea8958", "name": "晨曦红", "pinyin": "chenxihong" }, { - "CMYK": [ - 0, - 65, - 80, - 0 - ], - "RGB": [ - 242, - 118, - 53 - ], + "CMYK": [0, 65, 80, 0], + "RGB": [242, 118, 53], "hex": "#f27635", "name": "蟹壳红", "pinyin": "xiekehong" }, { - "CMYK": [ - 0, - 69, - 86, - 0 - ], - "RGB": [ - 248, - 107, - 29 - ], + "CMYK": [0, 69, 86, 0], + "RGB": [248, 107, 29], "hex": "#f86b1d", "name": "金莲花橙", "pinyin": "jinlianhuacheng" }, { - "CMYK": [ - 0, - 69, - 70, - 0 - ], - "RGB": [ - 239, - 111, - 72 - ], + "CMYK": [0, 69, 70, 0], + "RGB": [239, 111, 72], "hex": "#ef6f48", "name": "草莓红", "pinyin": "caomeihong" }, { - "CMYK": [ - 0, - 72, - 82, - 0 - ], - "RGB": [ - 239, - 99, - 43 - ], + "CMYK": [0, 72, 82, 0], + "RGB": [239, 99, 43], "hex": "#ef632b", "name": "龙睛鱼红", "pinyin": "longjingyuhong" }, { - "CMYK": [ - 0, - 81, - 84, - 0 - ], - "RGB": [ - 241, - 68, - 29 - ], + "CMYK": [0, 81, 84, 0], + "RGB": [241, 68, 29], "hex": "#f1441d", "name": "蜻蜓红", "pinyin": "qingtinghong" }, { - "CMYK": [ - 0, - 80, - 83, - 0 - ], - "RGB": [ - 240, - 75, - 34 - ], + "CMYK": [0, 80, 83, 0], + "RGB": [240, 75, 34], "hex": "#f04b22", "name": "大红", "pinyin": "dahong" }, { - "CMYK": [ - 0, - 80, - 85, - 0 - ], - "RGB": [ - 242, - 72, - 27 - ], + "CMYK": [0, 80, 85, 0], + "RGB": [242, 72, 27], "hex": "#f2481b", "name": "柿红", "pinyin": "shihong" }, { - "CMYK": [ - 0, - 80, - 85, - 0 - ], - "RGB": [ - 243, - 71, - 24 - ], + "CMYK": [0, 80, 85, 0], + "RGB": [243, 71, 24], "hex": "#f34718", "name": "榴花红", "pinyin": "liuhuahong" }, { - "CMYK": [ - 0, - 83, - 87, - 0 - ], - "RGB": [ - 244, - 62, - 6 - ], + "CMYK": [0, 83, 87, 0], + "RGB": [244, 62, 6], "hex": "#f43e06", "name": "银朱", "pinyin": "yinzhu" }, { - "CMYK": [ - 0, - 78, - 83, - 0 - ], - "RGB": [ - 237, - 81, - 38 - ], + "CMYK": [0, 78, 83, 0], + "RGB": [237, 81, 38], "hex": "#ed5126", "name": "朱红", "pinyin": "zhuhong" }, { - "CMYK": [ - 0, - 50, - 68, - 0 - ], - "RGB": [ - 240, - 156, - 90 - ], + "CMYK": [0, 50, 68, 0], + "RGB": [240, 156, 90], "hex": "#f09c5a", "name": "鲑鱼红", "pinyin": "guiyuhong" }, { - "CMYK": [ - 5, - 69, - 87, - 0 - ], - "RGB": [ - 242, - 123, - 31 - ], + "CMYK": [5, 69, 87, 0], + "RGB": [242, 123, 31], "hex": "#f26b1f", "name": "金黄", "pinyin": "jinhuang" }, { - "CMYK": [ - 7, - 52, - 71, - 1 - ], - "RGB": [ - 217, - 145, - 86 - ], + "CMYK": [7, 52, 71, 1], + "RGB": [217, 145, 86], "hex": "#d99156", "name": "鹿皮褐", "pinyin": "lupihe" }, { - "CMYK": [ - 4, - 57, - 82, - 1 - ], - "RGB": [ - 219, - 133, - 64 - ], + "CMYK": [4, 57, 82, 1], + "RGB": [219, 133, 64], "hex": "#db8540", "name": "醉瓜肉", "pinyin": "zuiguarou" }, { - "CMYK": [ - 0, - 64, - 93, - 0 - ], - "RGB": [ - 222, - 118, - 34 - ], + "CMYK": [0, 64, 93, 0], + "RGB": [222, 118, 34], "hex": "#de7622", "name": "麂棕", "pinyin": "jizong" }, { - "CMYK": [ - 22, - 28, - 34, - 6 - ], - "RGB": [ - 193, - 178, - 163 - ], + "CMYK": [22, 28, 34, 6], + "RGB": [193, 178, 163], "hex": "#c1b2a3", "name": "淡银灰", "pinyin": "danyinhui" }, { - "CMYK": [ - 18, - 57, - 76, - 6 - ], - "RGB": [ - 190, - 126, - 74 - ], + "CMYK": [18, 57, 76, 6], + "RGB": [190, 126, 74], "hex": "#be7e4a", "name": "淡赭", "pinyin": "danzhe" }, { - "CMYK": [ - 14, - 69, - 100, - 4 - ], - "RGB": [ - 193, - 101, - 26 - ], + "CMYK": [14, 69, 100, 4], + "RGB": [193, 101, 26], "hex": "#c1651a", "name": "槟榔综", "pinyin": "binglangzong" }, { - "CMYK": [ - 34, - 42, - 46, - 23 - ], - "RGB": [ - 145, - 128, - 114 - ], + "CMYK": [34, 42, 46, 23], + "RGB": [145, 128, 114], "hex": "#918072", "name": "银灰", "pinyin": "yinhui" }, { - "CMYK": [ - 42, - 40, - 46, - 20 - ], - "RGB": [ - 154, - 136, - 120 - ], + "CMYK": [42, 40, 46, 20], + "RGB": [154, 136, 120], "hex": "#9a8878", "name": "海鸥灰", "pinyin": "haiouhui" }, { - "CMYK": [ - 27, - 69, - 85, - 22 - ], - "RGB": [ - 148, - 88, - 51 - ], + "CMYK": [27, 69, 85, 22], + "RGB": [148, 88, 51], "hex": "#945833", "name": "淡咖啡", "pinyin": "dankafei" }, { - "CMYK": [ - 26, - 76, - 97, - 20 - ], - "RGB": [ - 150, - 77, - 34 - ], + "CMYK": [26, 76, 97, 20], + "RGB": [150, 77, 34], "hex": "#964d22", "name": "岩石棕", "pinyin": "yanshizong" }, { - "CMYK": [ - 25, - 80, - 100, - 20 - ], - "RGB": [ - 149, - 68, - 22 - ], + "CMYK": [25, 80, 100, 20], + "RGB": [149, 68, 22], "hex": "#954416", "name": "芒果棕", "pinyin": "mangguozong" }, { - "CMYK": [ - 39, - 60, - 58, - 51 - ], - "RGB": [ - 98, - 73, - 65 - ], + "CMYK": [39, 60, 58, 51], + "RGB": [98, 73, 65], "hex": "#624941", "name": "石板灰", "pinyin": "shibanhui" }, { - "CMYK": [ - 38, - 63, - 63, - 50 - ], - "RGB": [ - 100, - 72, - 61 - ], + "CMYK": [38, 63, 63, 50], + "RGB": [100, 72, 61], "hex": "#64483d", "name": "珠母灰", "pinyin": "zhumuhui" }, { - "CMYK": [ - 32, - 83, - 96, - 41 - ], - "RGB": [ - 113, - 54, - 29 - ], + "CMYK": [32, 83, 96, 41], + "RGB": [113, 54, 29], "hex": "#71361d", "name": "丁香棕", "pinyin": "dingxiangzong" }, { - "CMYK": [ - 30, - 87, - 100, - 38 - ], - "RGB": [ - 117, - 49, - 23 - ], + "CMYK": [30, 87, 100, 38], + "RGB": [117, 49, 23], "hex": "#753117", "name": "咖啡", "pinyin": "kafei" }, { - "CMYK": [ - 30, - 89, - 100, - 39 - ], - "RGB": [ - 115, - 46, - 18 - ], + "CMYK": [30, 89, 100, 39], + "RGB": [115, 46, 18], "hex": "#732e12", "name": "筍皮棕", "pinyin": "sunpizong" }, { - "CMYK": [ - 0, - 72, - 86, - 0 - ], - "RGB": [ - 252, - 99, - 21 - ], + "CMYK": [0, 72, 86, 0], + "RGB": [252, 99, 21], "hex": "#fc6315", "name": "燕颔红", "pinyin": "yanhanhong" }, { - "CMYK": [ - 3, - 38, - 39, - 0 - ], - "RGB": [ - 232, - 180, - 154 - ], + "CMYK": [3, 38, 39, 0], + "RGB": [232, 180, 154], "hex": "#e8b49a", "name": "玉粉红", "pinyin": "yufenhong" }, { - "CMYK": [ - 0, - 70, - 87, - 0 - ], - "RGB": [ - 228, - 104, - 40 - ], + "CMYK": [0, 70, 87, 0], + "RGB": [228, 104, 40], "hex": "#e46828", "name": "金驼", "pinyin": "jintuo" }, { - "CMYK": [ - 0, - 76, - 97, - 0 - ], - "RGB": [ - 216, - 89, - 22 - ], + "CMYK": [0, 76, 97, 0], + "RGB": [216, 89, 22], "hex": "#d85916", "name": "铁棕", "pinyin": "tiezong" }, { - "CMYK": [ - 23, - 35, - 38, - 10 - ], - "RGB": [ - 183, - 160, - 145 - ], + "CMYK": [23, 35, 38, 10], + "RGB": [183, 160, 145], "hex": "#b7a091", "name": "蛛网灰", "pinyin": "zhuwanghui" }, { - "CMYK": [ - 16, - 77, - 100, - 6 - ], - "RGB": [ - 183, - 81, - 29 - ], + "CMYK": [16, 77, 100, 6], + "RGB": [183, 81, 29], "hex": "#b7511d", "name": "淡可可棕", "pinyin": "dankekezong" }, { - "CMYK": [ - 31, - 63, - 66, - 31 - ], - "RGB": [ - 139, - 97, - 77 - ], + "CMYK": [31, 63, 66, 31], + "RGB": [139, 97, 77], "hex": "#8b614d", "name": "中红灰", "pinyin": "zhonghonghui" }, { - "CMYK": [ - 28, - 76, - 82, - 26 - ], - "RGB": [ - 140, - 75, - 49 - ], + "CMYK": [28, 76, 82, 26], + "RGB": [140, 75, 49], "hex": "#8c4b31", "name": "淡土黄", "pinyin": "dantuhuang" }, { - "CMYK": [ - 28, - 83, - 92, - 28 - ], - "RGB": [ - 135, - 61, - 36 - ], + "CMYK": [28, 83, 92, 28], + "RGB": [135, 61, 36], "hex": "#873d24", "name": "淡豆沙", "pinyin": "dandousha" }, { - "CMYK": [ - 27, - 85, - 98, - 27 - ], - "RGB": [ - 136, - 58, - 30 - ], + "CMYK": [27, 85, 98, 27], + "RGB": [136, 58, 30], "hex": "#883a1e", "name": "椰壳棕", "pinyin": "yekezong" }, { - "CMYK": [ - 40, - 64, - 61, - 56 - ], - "RGB": [ - 91, - 66, - 58 - ], + "CMYK": [40, 64, 61, 56], + "RGB": [91, 66, 58], "hex": "#5b423a", "name": "淡铁灰", "pinyin": "dantiehui" }, { - "CMYK": [ - 37, - 72, - 72, - 52 - ], - "RGB": [ - 96, - 61, - 48 - ], + "CMYK": [37, 72, 72, 52], + "RGB": [96, 61, 48], "hex": "#603d30", "name": "中灰驼", "pinyin": "zhonghuituo" }, { - "CMYK": [ - 34, - 82, - 85, - 47 - ], - "RGB": [ - 103, - 52, - 36 - ], + "CMYK": [34, 82, 85, 47], + "RGB": [103, 52, 36], "hex": "#673424", "name": "淡栗棕", "pinyin": "danlizong" }, { - "CMYK": [ - 33, - 89, - 92, - 48 - ], - "RGB": [ - 101, - 43, - 28 - ], + "CMYK": [33, 89, 92, 48], + "RGB": [101, 43, 28], "hex": "#652b1c", "name": "可可棕", "pinyin": "kekezong" }, { - "CMYK": [ - 32, - 90, - 95, - 45 - ], - "RGB": [ - 105, - 42, - 27 - ], + "CMYK": [32, 90, 95, 45], + "RGB": [105, 42, 27], "hex": "#692a1b", "name": "柞叶棕", "pinyin": "zhayezong" }, { - "CMYK": [ - 0, - 53, - 59, - 0 - ], - "RGB": [ - 251, - 153, - 104 - ], + "CMYK": [0, 53, 59, 0], + "RGB": [251, 153, 104], "hex": "#fb9968", "name": "野蔷薇红", "pinyin": "yeqiangweihong" }, { - "CMYK": [ - 0, - 65, - 79, - 0 - ], - "RGB": [ - 252, - 121, - 48 - ], + "CMYK": [0, 65, 79, 0], + "RGB": [252, 121, 48], "hex": "#fc7930", "name": "菠萝红", "pinyin": "boluohong" }, { - "CMYK": [ - 2, - 31, - 31, - 0 - ], - "RGB": [ - 237, - 195, - 174 - ], + "CMYK": [2, 31, 31, 0], + "RGB": [237, 195, 174], "hex": "#edc3ae", "name": "藕荷", "pinyin": "ouhe" }, { - "CMYK": [ - 0, - 70, - 91, - 0 - ], - "RGB": [ - 225, - 103, - 35 - ], + "CMYK": [0, 70, 91, 0], + "RGB": [225, 103, 35], "hex": "#e16723", "name": "陶瓷红", "pinyin": "taocihong" }, { - "CMYK": [ - 16, - 23, - 27, - 2 - ], - "RGB": [ - 212, - 196, - 183 - ], + "CMYK": [16, 23, 27, 2], + "RGB": [212, 196, 183], "hex": "#d4c4b7", "name": "晓灰", "pinyin": "xiaohui" }, { - "CMYK": [ - 9, - 64, - 78, - 1 - ], - "RGB": [ - 207, - 117, - 67 - ], + "CMYK": [9, 64, 78, 1], + "RGB": [207, 117, 67], "hex": "#cf7543", "name": "余烬红", "pinyin": "yujinhong" }, { - "CMYK": [ - 8, - 72, - 93, - 1 - ], - "RGB": [ - 205, - 98, - 39 - ], + "CMYK": [8, 72, 93, 1], + "RGB": [205, 98, 39], "hex": "#cd6227", "name": "火砖红", "pinyin": "huozhuanhong" }, { - "CMYK": [ - 22, - 64, - 71, - 12 - ], - "RGB": [ - 170, - 106, - 76 - ], + "CMYK": [22, 64, 71, 12], + "RGB": [170, 106, 76], "hex": "#aa6a4c", "name": "火泥棕", "pinyin": "huonizong" }, { - "CMYK": [ - 20, - 76, - 92, - 9 - ], - "RGB": [ - 166, - 82, - 44 - ], + "CMYK": [20, 76, 92, 9], + "RGB": [166, 82, 44], "hex": "#a6522c", "name": "绀红", "pinyin": "ganhong" }, { - "CMYK": [ - 31, - 79, - 77, - 37 - ], - "RGB": [ - 119, - 61, - 49 - ], + "CMYK": [31, 79, 77, 37], + "RGB": [119, 61, 49], "hex": "#773d31", "name": "橡树棕", "pinyin": "xiangshuzong" }, { - "CMYK": [ - 45, - 68, - 57, - 66 - ], - "RGB": [ - 72, - 51, - 50 - ], + "CMYK": [45, 68, 57, 66], + "RGB": [72, 51, 50], "hex": "#483332", "name": "海报灰", "pinyin": "haibaohui" }, { - "CMYK": [ - 41, - 76, - 64, - 65 - ], - "RGB": [ - 175, - 46, - 43 - ], + "CMYK": [41, 76, 64, 65], + "RGB": [175, 46, 43], "hex": "#4b2e2b", "name": "玫瑰灰", "pinyin": "meiguihui" }, { - "CMYK": [ - 41, - 84, - 71, - 67 - ], - "RGB": [ - 72, - 37, - 34 - ], + "CMYK": [41, 84, 71, 67], + "RGB": [72, 37, 34], "hex": "#482522", "name": "火山棕", "pinyin": "huoshanzong" }, { - "CMYK": [ - 40, - 92, - 78, - 66 - ], - "RGB": [ - 72, - 30, - 28 - ], + "CMYK": [40, 92, 78, 66], + "RGB": [72, 30, 28], "hex": "#481e1c", "name": "豆沙", "pinyin": "dousha" }, { - "CMYK": [ - 0, - 9, - 12, - 0 - ], - "RGB": [ - 251, - 238, - 226 - ], + "CMYK": [0, 9, 12, 0], + "RGB": [251, 238, 226], "hex": "#fbeee2", "name": "淡米粉", "pinyin": "danmifen" }, { - "CMYK": [ - 0, - 19, - 19, - 0 - ], - "RGB": [ - 246, - 220, - 206 - ], + "CMYK": [0, 19, 19, 0], + "RGB": [246, 220, 206], "hex": "#f6dcce", "name": "初桃粉红", "pinyin": "chutaofenhong" }, { - "CMYK": [ - 0, - 27, - 27, - 0 - ], - "RGB": [ - 247, - 207, - 186 - ], + "CMYK": [0, 27, 27, 0], + "RGB": [247, 207, 186], "hex": "#f7cfba", "name": "介壳淡粉红", "pinyin": "jieqiaodanfenhong" }, { - "CMYK": [ - 0, - 43, - 43, - 0 - ], - "RGB": [ - 246, - 173, - 143 - ], + "CMYK": [0, 43, 43, 0], + "RGB": [246, 173, 143], "hex": "#f6ad8f", "name": "淡藏花红", "pinyin": "dancanghuahong" }, { - "CMYK": [ - 0, - 58, - 61, - 0 - ], - "RGB": [ - 246, - 140, - 96 - ], + "CMYK": [0, 58, 61, 0], + "RGB": [246, 140, 96], "hex": "#f68c60", "name": "瓜瓤红", "pinyin": "guaranghong" }, { - "CMYK": [ - 0, - 67, - 74, - 0 - ], - "RGB": [ - 249, - 114, - 61 - ], + "CMYK": [0, 67, 74, 0], + "RGB": [249, 114, 61], "hex": "#f9723d", "name": "芙蓉红", "pinyin": "furonghong" }, { - "CMYK": [ - 0, - 74, - 85, - 0 - ], - "RGB": [ - 250, - 93, - 25 - ], + "CMYK": [0, 74, 85, 0], + "RGB": [250, 93, 25], "hex": "#fa5d19", "name": "莓酱红", "pinyin": "meijianghong" }, { - "CMYK": [ - 0, - 62, - 66, - 0 - ], - "RGB": [ - 238, - 128, - 85 - ], + "CMYK": [0, 62, 66, 0], + "RGB": [238, 128, 85], "hex": "#ee8055", "name": "法螺红", "pinyin": "faluohong" }, { - "CMYK": [ - 4, - 82, - 99, - 0 - ], - "RGB": [ - 207, - 72, - 19 - ], + "CMYK": [4, 82, 99, 0], + "RGB": [207, 72, 19], "hex": "#cf4813", "name": "落霞红", "pinyin": "luoxiahong" }, { - "CMYK": [ - 21, - 43, - 43, - 9 - ], - "RGB": [ - 184, - 148, - 133 - ], + "CMYK": [21, 43, 43, 9], + "RGB": [184, 148, 133], "hex": "#b89485", "name": "淡玫瑰灰", "pinyin": "danmeiguihui" }, { - "CMYK": [ - 18, - 80, - 92, - 7 - ], - "RGB": [ - 177, - 75, - 40 - ], + "CMYK": [18, 80, 92, 7], + "RGB": [177, 75, 40], "hex": "#b14b28", "name": "蟹蝥红", "pinyin": "xiemaohong" }, { - "CMYK": [ - 27, - 91, - 95, - 28 - ], - "RGB": [ - 134, - 48, - 32 - ], + "CMYK": [27, 91, 95, 28], + "RGB": [134, 48, 32], "hex": "#863020", "name": "火岩棕", "pinyin": "huoyanzong" }, { - "CMYK": [ - 27, - 96, - 100, - 27 - ], - "RGB": [ - 134, - 38, - 23 - ], + "CMYK": [27, 96, 100, 27], + "RGB": [134, 38, 23], "hex": "#862617", "name": "赭石", "pinyin": "zheshi" }, { - "CMYK": [ - 36, - 90, - 82, - 56 - ], - "RGB": [ - 89, - 38, - 32 - ], + "CMYK": [36, 90, 82, 56], + "RGB": [89, 38, 32], "hex": "#592620", "name": "暗驼棕", "pinyin": "antuozong" }, { - "CMYK": [ - 35, - 96, - 88, - 55 - ], - "RGB": [ - 90, - 31, - 27 - ], + "CMYK": [35, 96, 88, 55], + "RGB": [90, 31, 27], "hex": "#5a1f1b", "name": "酱棕", "pinyin": "jiangzong" }, { - "CMYK": [ - 34, - 98, - 91, - 53 - ], - "RGB": [ - 92, - 30, - 25 - ], + "CMYK": [34, 98, 91, 53], + "RGB": [92, 30, 25], "hex": "#5c1e19", "name": "栗棕", "pinyin": "lizong" }, { - "CMYK": [ - 0, - 31, - 24, - 0 - ], - "RGB": [ - 244, - 199, - 186 - ], + "CMYK": [0, 31, 24, 0], + "RGB": [244, 199, 186], "hex": "#f4c7ba", "name": "洋水仙红", "pinyin": "yangshuixianhong" }, { - "CMYK": [ - 0, - 67, - 55, - 0 - ], - "RGB": [ - 241, - 118, - 102 - ], + "CMYK": [0, 67, 55, 0], + "RGB": [241, 118, 102], "hex": "#f17666", "name": "谷鞘红", "pinyin": "guqiaohong" }, { - "CMYK": [ - 0, - 77, - 69, - 0 - ], - "RGB": [ - 241, - 86, - 66 - ], + "CMYK": [0, 77, 69, 0], + "RGB": [241, 86, 66], "hex": "#f15642", "name": "苹果红", "pinyin": "pingguohong" }, { - "CMYK": [ - 0, - 84, - 82, - 0 - ], - "RGB": [ - 245, - 57, - 28 - ], + "CMYK": [0, 84, 82, 0], + "RGB": [245, 57, 28], "hex": "#f5391c", "name": "铁水红", "pinyin": "tieshuihong" }, { - "CMYK": [ - 0, - 76, - 67, - 0 - ], - "RGB": [ - 242, - 90, - 71 - ], + "CMYK": [0, 76, 67, 0], + "RGB": [242, 90, 71], "hex": "#f25a47", "name": "桂红", "pinyin": "guihong" }, { - "CMYK": [ - 0, - 84, - 82, - 0 - ], - "RGB": [ - 243, - 59, - 31 - ], + "CMYK": [0, 84, 82, 0], + "RGB": [243, 59, 31], "hex": "#f33b1f", "name": "极光红", "pinyin": "jiguanghong" }, { - "CMYK": [ - 0, - 38, - 25, - 0 - ], - "RGB": [ - 242, - 185, - 178 - ], + "CMYK": [0, 38, 25, 0], + "RGB": [242, 185, 178], "hex": "#f2b9b2", "name": "粉红", "pinyin": "fenhong" }, { - "CMYK": [ - 0, - 53, - 36, - 0 - ], - "RGB": [ - 241, - 151, - 144 - ], + "CMYK": [0, 53, 36, 0], + "RGB": [241, 151, 144], "hex": "#f19790", "name": "舌红", "pinyin": "shehong" }, { - "CMYK": [ - 0, - 76, - 68, - 0 - ], - "RGB": [ - 240, - 90, - 70 - ], + "CMYK": [0, 76, 68, 0], + "RGB": [240, 90, 70], "hex": "#f05a46", "name": "曲红", "pinyin": "quhong" }, { - "CMYK": [ - 0, - 83, - 81, - 0 - ], - "RGB": [ - 242, - 62, - 35 - ], + "CMYK": [0, 83, 81, 0], + "RGB": [242, 62, 35], "hex": "#f23e23", "name": "红汞红", "pinyin": "honggonghong" }, { - "CMYK": [ - 0, - 29, - 16, - 0 - ], - "RGB": [ - 242, - 202, - 201 - ], + "CMYK": [0, 29, 16, 0], + "RGB": [242, 202, 201], "hex": "#f2cac9", "name": "淡绯", "pinyin": "danfei" }, { - "CMYK": [ - 0, - 43, - 24, - 0 - ], - "RGB": [ - 239, - 175, - 173 - ], + "CMYK": [0, 43, 24, 0], + "RGB": [239, 175, 173], "hex": "#efafad", "name": "无花果红", "pinyin": "wuhuaguohong" }, { - "CMYK": [ - 0, - 57, - 36, - 0 - ], - "RGB": [ - 241, - 144, - 140 - ], + "CMYK": [0, 57, 36, 0], + "RGB": [241, 144, 140], "hex": "#f1908c", "name": "榴子红", "pinyin": "liuzihong" }, { - "CMYK": [ - 0, - 83, - 81, - 0 - ], - "RGB": [ - 240, - 63, - 36 - ], + "CMYK": [0, 83, 81, 0], + "RGB": [240, 63, 36], "hex": "#f03f24", "name": "胭脂红", "pinyin": "yanzhihong" }, { - "CMYK": [ - 0, - 50, - 23, - 0 - ], - "RGB": [ - 240, - 161, - 168 - ], + "CMYK": [0, 50, 23, 0], + "RGB": [240, 161, 168], "hex": "#f0a1a8", "name": "合欢红", "pinyin": "hehuanhong" }, { - "CMYK": [ - 0, - 56, - 27, - 0 - ], - "RGB": [ - 241, - 147, - 156 - ], + "CMYK": [0, 56, 27, 0], + "RGB": [241, 147, 156], "hex": "#f1939c", "name": "春梅红", "pinyin": "chunmeihong" }, { - "CMYK": [ - 0, - 65, - 38, - 0 - ], - "RGB": [ - 240, - 124, - 130 - ], + "CMYK": [0, 65, 38, 0], + "RGB": [240, 124, 130], "hex": "#f07c82", "name": "香叶红", "pinyin": "xiangyehong" }, { - "CMYK": [ - 0, - 80, - 72, - 0 - ], - "RGB": [ - 240, - 74, - 58 - ], + "CMYK": [0, 80, 72, 0], + "RGB": [240, 74, 58], "hex": "#f04a3a", "name": "珊瑚红", "pinyin": "shanhuhong" }, { - "CMYK": [ - 0, - 84, - 82, - 0 - ], - "RGB": [ - 241, - 60, - 34 - ], + "CMYK": [0, 84, 82, 0], + "RGB": [241, 60, 34], "hex": "#f13c22", "name": "萝卜红", "pinyin": "luobohong" }, { - "CMYK": [ - 0, - 65, - 29, - 0 - ], - "RGB": [ - 231, - 124, - 142 - ], + "CMYK": [0, 65, 29, 0], + "RGB": [231, 124, 142], "hex": "#e77c8e", "name": "淡茜红", "pinyin": "danqianhong" }, { - "CMYK": [ - 0, - 77, - 49, - 0 - ], - "RGB": [ - 237, - 90, - 101 - ], + "CMYK": [0, 77, 49, 0], + "RGB": [237, 90, 101], "hex": "#ed5a65", "name": "艳红", "pinyin": "yanhong" }, { - "CMYK": [ - 0, - 81, - 66, - 0 - ], - "RGB": [ - 237, - 72, - 69 - ], + "CMYK": [0, 81, 66, 0], + "RGB": [237, 72, 69], "hex": "#ed4845", "name": "淡菽红", "pinyin": "danshuhong" }, { - "CMYK": [ - 0, - 84, - 76, - 0 - ], - "RGB": [ - 237, - 59, - 47 - ], + "CMYK": [0, 84, 76, 0], + "RGB": [237, 59, 47], "hex": "#ed3b2f", "name": "鱼鳃红", "pinyin": "yusaihong" }, { - "CMYK": [ - 0, - 86, - 82, - 0 - ], - "RGB": [ - 237, - 51, - 33 - ], + "CMYK": [0, 86, 82, 0], + "RGB": [237, 51, 33], "hex": "#ed3321", "name": "樱桃红", "pinyin": "yingtaohong" }, { - "CMYK": [ - 0, - 82, - 44, - 0 - ], - "RGB": [ - 238, - 72, - 102 - ], + "CMYK": [0, 82, 44, 0], + "RGB": [238, 72, 102], "hex": "#ee4866", "name": "淡蕊香红", "pinyin": "danruixianghong" }, { - "CMYK": [ - 0, - 82, - 46, - 0 - ], - "RGB": [ - 238, - 72, - 99 - ], + "CMYK": [0, 82, 46, 0], + "RGB": [238, 72, 99], "hex": "#ee4863", "name": "石竹红", "pinyin": "shizhuhong" }, { - "CMYK": [ - 0, - 82, - 50, - 0 - ], - "RGB": [ - 239, - 71, - 93 - ], + "CMYK": [0, 82, 50, 0], + "RGB": [239, 71, 93], "hex": "#ef475d", "name": "草茉莉红", "pinyin": "caomolihong" }, { - "CMYK": [ - 0, - 84, - 60, - 0 - ], - "RGB": [ - 238, - 63, - 77 - ], + "CMYK": [0, 84, 60, 0], + "RGB": [238, 63, 77], "hex": "#ee3f4d", "name": "茶花红", "pinyin": "chahuahong" }, { - "CMYK": [ - 0, - 86, - 74, - 0 - ], - "RGB": [ - 237, - 51, - 51 - ], + "CMYK": [0, 86, 74, 0], + "RGB": [237, 51, 51], "hex": "#ed3333", "name": "枸枢红", "pinyin": "goushuhong" }, { - "CMYK": [ - 0, - 88, - 81, - 0 - ], - "RGB": [ - 236, - 43, - 36 - ], + "CMYK": [0, 88, 81, 0], + "RGB": [236, 43, 36], "hex": "#ec2b24", "name": "秋海棠红", "pinyin": "qiuhaitanghong" }, { - "CMYK": [ - 0, - 89, - 84, - 0 - ], - "RGB": [ - 235, - 38, - 26 - ], + "CMYK": [0, 89, 84, 0], + "RGB": [235, 38, 26], "hex": "#eb261a", "name": "丽春红", "pinyin": "lichunhong" }, { - "CMYK": [ - 0, - 90, - 90, - 0 - ], - "RGB": [ - 222, - 42, - 24 - ], + "CMYK": [0, 90, 90, 0], + "RGB": [222, 42, 24], "hex": "#de2a18", "name": "夕阳红", "pinyin": "xiyanghong" }, { - "CMYK": [ - 0, - 92, - 95, - 0 - ], - "RGB": [ - 212, - 37, - 23 - ], + "CMYK": [0, 92, 95, 0], + "RGB": [212, 37, 23], "hex": "#d42517", "name": "鹤顶红", "pinyin": "hedinghong" }, { - "CMYK": [ - 19, - 89, - 85, - 9 - ], - "RGB": [ - 171, - 55, - 47 - ], + "CMYK": [19, 89, 85, 9], + "RGB": [171, 55, 47], "hex": "#ab372f", "name": "鹅血石红", "pinyin": "exueshihong" }, { - "CMYK": [ - 17, - 98, - 100, - 8 - ], - "RGB": [ - 172, - 31, - 24 - ], + "CMYK": [17, 98, 100, 8], + "RGB": [172, 31, 24], "hex": "#ac1f18", "name": "覆盆子红", "pinyin": "fupenzihong" }, { - "CMYK": [ - 36, - 81, - 64, - 54 - ], - "RGB": [ - 93, - 49, - 49 - ], + "CMYK": [36, 81, 64, 54], + "RGB": [93, 49, 49], "hex": "#5d3131", "name": "貂紫", "pinyin": "diaozi" }, { - "CMYK": [ - 35, - 94, - 77, - 53 - ], - "RGB": [ - 92, - 34, - 35 - ], + "CMYK": [35, 94, 77, 53], + "RGB": [92, 34, 35], "hex": "#5c2223", "name": "暗玉紫", "pinyin": "anyuzi" }, { - "CMYK": [ - 35, - 100, - 85, - 54 - ], - "RGB": [ - 90, - 25, - 27 - ], + "CMYK": [35, 100, 85, 54], + "RGB": [90, 25, 27], "hex": "#5a191b", "name": "栗紫", "pinyin": "lizi" }, { - "CMYK": [ - 35, - 100, - 80, - 54 - ], - "RGB": [ - 90, - 18, - 22 - ], + "CMYK": [35, 100, 80, 54], + "RGB": [90, 18, 22], "hex": "#5a1216", "name": "葡萄酱紫", "pinyin": "putaojiangzi" }, { - "CMYK": [ - 0, - 49, - 27, - 0 - ], - "RGB": [ - 238, - 162, - 164 - ], + "CMYK": [0, 49, 27, 0], + "RGB": [238, 162, 164], "hex": "#eea2a4", "name": "牡丹粉红", "pinyin": "mudanfenhong" }, { - "CMYK": [ - 0, - 78, - 44, - 0 - ], - "RGB": [ - 237, - 85, - 106 - ], + "CMYK": [0, 78, 44, 0], + "RGB": [237, 85, 106], "hex": "#ed556a", "name": "山茶红", "pinyin": "shanchahong" }, { - "CMYK": [ - 0, - 86, - 55, - 0 - ], - "RGB": [ - 240, - 55, - 82 - ], + "CMYK": [0, 86, 55, 0], + "RGB": [240, 55, 82], "hex": "#f03752", "name": "海棠红", "pinyin": "haitanghong" }, { - "CMYK": [ - 13, - 83, - 62, - 3 - ], - "RGB": [ - 192, - 72, - 81 - ], + "CMYK": [13, 83, 62, 3], + "RGB": [192, 72, 81], "hex": "#c04851", "name": "玉红", "pinyin": "yuhong" }, { - "CMYK": [ - 11, - 93, - 77, - 2 - ], - "RGB": [ - 192, - 44, - 56 - ], + "CMYK": [11, 93, 77, 2], + "RGB": [192, 44, 56], "hex": "#c02c38", "name": "高粱红", "pinyin": "gaolianghong" }, { - "CMYK": [ - 22, - 76, - 54, - 12 - ], - "RGB": [ - 167, - 83, - 90 - ], + "CMYK": [22, 76, 54, 12], + "RGB": [167, 83, 90], "hex": "#a7535a", "name": "满江红", "pinyin": "manjianghong" }, { - "CMYK": [ - 28, - 100, - 86, - 33 - ], - "RGB": [ - 124, - 24, - 35 - ], + "CMYK": [28, 100, 86, 33], + "RGB": [124, 24, 35], "hex": "#7c1823", "name": "枣红", "pinyin": "zaohong" }, { - "CMYK": [ - 39, - 92, - 67, - 64 - ], - "RGB": [ - 76, - 31, - 36 - ], + "CMYK": [39, 92, 67, 64], + "RGB": [76, 31, 36], "hex": "#4c1f24", "name": "葡萄紫", "pinyin": "putaozi" }, { - "CMYK": [ - 39, - 100, - 79, - 63 - ], - "RGB": [ - 77, - 16, - 24 - ], + "CMYK": [39, 100, 79, 63], + "RGB": [77, 16, 24], "hex": "#4d1018", "name": "酱紫", "pinyin": "jiangzi" }, { - "CMYK": [ - 0, - 89, - 62, - 0 - ], - "RGB": [ - 238, - 39, - 70 - ], + "CMYK": [0, 89, 62, 0], + "RGB": [238, 39, 70], "hex": "#ee2746", "name": "淡曙红", "pinyin": "danshuhong" }, { - "CMYK": [ - 0, - 93, - 76, - 0 - ], - "RGB": [ - 222, - 28, - 49 - ], + "CMYK": [0, 93, 76, 0], + "RGB": [222, 28, 49], "hex": "#de1c31", "name": "唐菖蒲红", "pinyin": "tangchangpuhong" }, { - "CMYK": [ - 1, - 95, - 82, - 0 - ], - "RGB": [ - 209, - 26, - 45 - ], + "CMYK": [1, 95, 82, 0], + "RGB": [209, 26, 45], "hex": "#d11a2d", "name": "鹅冠红", "pinyin": "eguanhong" }, { - "CMYK": [ - 13, - 76, - 50, - 2 - ], - "RGB": [ - 196, - 90, - 101 - ], + "CMYK": [13, 76, 50, 2], + "RGB": [196, 90, 101], "hex": "#c45a65", "name": "莓红", "pinyin": "meihong" }, { - "CMYK": [ - 10, - 96, - 82, - 2 - ], - "RGB": [ - 194, - 31, - 48 - ], + "CMYK": [10, 96, 82, 2], + "RGB": [194, 31, 48], "hex": "#c21f30", "name": "枫叶红", "pinyin": "fengyehong" }, { - "CMYK": [ - 19, - 99, - 86, - 11 - ], - "RGB": [ - 166, - 27, - 41 - ], + "CMYK": [19, 99, 86, 11], + "RGB": [166, 27, 41], "hex": "#a61b29", "name": "苋菜红", "pinyin": "xiancaihong" }, { - "CMYK": [ - 29, - 73, - 51, - 28 - ], - "RGB": [ - 137, - 78, - 84 - ], + "CMYK": [29, 73, 51, 28], + "RGB": [137, 78, 84], "hex": "#894e54", "name": "烟红", "pinyin": "yanhong" }, { - "CMYK": [ - 27, - 98, - 79, - 30 - ], - "RGB": [ - 130, - 32, - 43 - ], + "CMYK": [27, 98, 79, 30], + "RGB": [130, 32, 43], "hex": "#82202b", "name": "暗紫苑红", "pinyin": "anziyuanhong" }, { - "CMYK": [ - 27, - 100, - 90, - 29 - ], - "RGB": [ - 130, - 17, - 31 - ], + "CMYK": [27, 100, 90, 29], + "RGB": [130, 17, 31], "hex": "#82111f", "name": "殷红", "pinyin": "yanhong" }, { - "CMYK": [ - 36, - 95, - 71, - 59 - ], - "RGB": [ - 84, - 30, - 36 - ], + "CMYK": [36, 95, 71, 59], + "RGB": [84, 30, 36], "hex": "#541e24", "name": "猪肝紫", "pinyin": "zhuganzi" }, { - "CMYK": [ - 38, - 100, - 81, - 61 - ], - "RGB": [ - 80, - 10, - 22 - ], + "CMYK": [38, 100, 81, 61], + "RGB": [80, 10, 22], "hex": "#500a16", "name": "金鱼紫", "pinyin": "jinyuzi" }, { - "CMYK": [ - 1, - 11, - 9, - 0 - ], - "RGB": [ - 248, - 235, - 230 - ], + "CMYK": [1, 11, 9, 0], + "RGB": [248, 235, 230], "hex": "#f8ebe6", "name": "草珠红", "pinyin": "caozhuhong" }, { - "CMYK": [ - 0, - 68, - 21, - 0 - ], - "RGB": [ - 236, - 118, - 150 - ], + "CMYK": [0, 68, 21, 0], + "RGB": [236, 118, 150], "hex": "#ec7696", "name": "淡绛红", "pinyin": "danjianghong" }, { - "CMYK": [ - 0, - 86, - 30, - 0 - ], - "RGB": [ - 239, - 52, - 115 - ], + "CMYK": [0, 86, 30, 0], + "RGB": [239, 52, 115], "hex": "#ef3473", "name": "品红", "pinyin": "pinhong" }, { - "CMYK": [ - 0, - 69, - 22, - 0 - ], - "RGB": [ - 234, - 114, - 147 - ], + "CMYK": [0, 69, 22, 0], + "RGB": [234, 114, 147], "hex": "#ea7293", "name": "凤仙花红", "pinyin": "fengxianhuahong" }, { - "CMYK": [ - 0, - 52, - 18, - 0 - ], - "RGB": [ - 236, - 155, - 173 - ], + "CMYK": [0, 52, 18, 0], + "RGB": [236, 155, 173], "hex": "#ec9bad", "name": "粉团花红", "pinyin": "fentuanhuahong" }, { - "CMYK": [ - 0, - 80, - 28, - 0 - ], - "RGB": [ - 235, - 80, - 126 - ], + "CMYK": [0, 80, 28, 0], + "RGB": [235, 80, 126], "hex": "#eb507e", "name": "夹竹桃红", "pinyin": "jiazhutaohong" }, { - "CMYK": [ - 0, - 88, - 36, - 0 - ], - "RGB": [ - 237, - 47, - 106 - ], + "CMYK": [0, 88, 36, 0], + "RGB": [237, 47, 106], "hex": "#ed2f6a", "name": "榲桲红", "pinyin": "wenpohong" }, { - "CMYK": [ - 0, - 39, - 14, - 0 - ], - "RGB": [ - 238, - 184, - 195 - ], + "CMYK": [0, 39, 14, 0], + "RGB": [238, 184, 195], "hex": "#eeb8c3", "name": "姜红", "pinyin": "jianghong" }, { - "CMYK": [ - 0, - 80, - 27, - 0 - ], - "RGB": [ - 234, - 81, - 127 - ], + "CMYK": [0, 80, 27, 0], + "RGB": [234, 81, 127], "hex": "#ea517f", "name": "莲瓣红", "pinyin": "lianbanhong" }, { - "CMYK": [ - 0, - 33, - 11, - 0 - ], - "RGB": [ - 241, - 196, - 205 - ], + "CMYK": [0, 33, 11, 0], + "RGB": [241, 196, 205], "hex": "#f1c4cd", "name": "水红", "pinyin": "shuihong" }, { - "CMYK": [ - 0, - 60, - 18, - 0 - ], - "RGB": [ - 236, - 138, - 164 - ], + "CMYK": [0, 60, 18, 0], + "RGB": [236, 138, 164], "hex": "#ec8aa4", "name": "报春红", "pinyin": "baochunhong" }, { - "CMYK": [ - 8, - 78, - 35, - 1 - ], - "RGB": [ - 206, - 87, - 109 - ], + "CMYK": [8, 78, 35, 1], + "RGB": [206, 87, 109], "hex": "#ce5777", "name": "月季红", "pinyin": "yuejihong" }, { - "CMYK": [ - 0, - 52, - 15, - 0 - ], - "RGB": [ - 237, - 157, - 178 - ], + "CMYK": [0, 52, 15, 0], + "RGB": [237, 157, 178], "hex": "#ed9db2", "name": "豇豆红", "pinyin": "jiangdouhong" }, { - "CMYK": [ - 0, - 63, - 18, - 0 - ], - "RGB": [ - 239, - 130, - 160 - ], + "CMYK": [0, 63, 18, 0], + "RGB": [239, 130, 160], "hex": "#ef82a0", "name": "霞光红", "pinyin": "xiaguanghong" }, { - "CMYK": [ - 0, - 85, - 33, - 0 - ], - "RGB": [ - 235, - 60, - 112 - ], + "CMYK": [0, 85, 33, 0], + "RGB": [235, 60, 112], "hex": "#eb3c70", "name": "松叶牡丹红", "pinyin": "songyemudanhong" }, { - "CMYK": [ - 0, - 88, - 40, - 0 - ], - "RGB": [ - 236, - 44, - 100 - ], + "CMYK": [0, 88, 40, 0], + "RGB": [236, 44, 100], "hex": "#ec2c64", "name": "喜蛋红", "pinyin": "xidanhong" }, { - "CMYK": [ - 5, - 38, - 20, - 0 - ], - "RGB": [ - 227, - 180, - 184 - ], + "CMYK": [5, 38, 20, 0], + "RGB": [227, 180, 184], "hex": "#e3b4b8", "name": "鼠鼻红", "pinyin": "shubihong" }, { - "CMYK": [ - 5, - 96, - 73, - 1 - ], - "RGB": [ - 204, - 22, - 58 - ], + "CMYK": [5, 96, 73, 1], + "RGB": [204, 22, 58], "hex": "#cc163a", "name": "尖晶玉红", "pinyin": "jianjingyuhong" }, { - "CMYK": [ - 16, - 61, - 34, - 4 - ], - "RGB": [ - 194, - 124, - 136 - ], + "CMYK": [16, 61, 34, 4], + "RGB": [194, 124, 136], "hex": "#c27c88", "name": "山黎豆红", "pinyin": "shanlidouhong" }, { - "CMYK": [ - 13, - 90, - 56, - 3 - ], - "RGB": [ - 191, - 53, - 83 - ], + "CMYK": [13, 90, 56, 3], + "RGB": [191, 53, 83], "hex": "#bf3553", "name": "锦葵红", "pinyin": "jinkuihong" }, { - "CMYK": [ - 41, - 64, - 44, - 36 - ], - "RGB": [ - 115, - 87, - 92 - ], + "CMYK": [41, 64, 44, 36], + "RGB": [115, 87, 92], "hex": "#73575c", "name": "鼠背灰", "pinyin": "shubeihui" }, { - "CMYK": [ - 33, - 100, - 75, - 49 - ], - "RGB": [ - 98, - 22, - 36 - ], + "CMYK": [33, 100, 75, 49], + "RGB": [98, 22, 36], "hex": "#621624", "name": "甘蔗紫", "pinyin": "ganzhezi" }, { - "CMYK": [ - 32, - 100, - 84, - 49 - ], - "RGB": [ - 99, - 7, - 28 - ], + "CMYK": [32, 100, 84, 49], + "RGB": [99, 7, 28], "hex": "#63071c", "name": "石竹紫", "pinyin": "shizhuzi" }, { - "CMYK": [ - 57, - 72, - 54, - 74 - ], - "RGB": [ - 54, - 40, - 43 - ], + "CMYK": [57, 72, 54, 74], + "RGB": [54, 40, 43], "hex": "#36282b", "name": "苍蝇灰", "pinyin": "cangyinghui" }, { - "CMYK": [ - 52, - 88, - 58, - 81 - ], - "RGB": [ - 48, - 22, - 28 - ], + "CMYK": [52, 88, 58, 81], + "RGB": [48, 22, 28], "hex": "#30161c", "name": "卵石紫", "pinyin": "luanshizi" }, { - "CMYK": [ - 56, - 88, - 62, - 84 - ], - "RGB": [ - 43, - 18, - 22 - ], + "CMYK": [56, 88, 62, 84], + "RGB": [43, 18, 22], "hex": "#2b1216", "name": "李紫", "pinyin": "lizi" }, { - "CMYK": [ - 58, - 90, - 63, - 83 - ], - "RGB": [ - 45, - 12, - 19 - ], + "CMYK": [58, 90, 63, 83], + "RGB": [45, 12, 19], "hex": "#2d0c13", "name": "茄皮紫", "pinyin": "qiepizi" }, { - "CMYK": [ - 0, - 76, - 16, - 0 - ], - "RGB": [ - 206, - 94, - 138 - ], + "CMYK": [0, 76, 16, 0], + "RGB": [206, 94, 138], "hex": "#ce5e8a", "name": "吊钟花红", "pinyin": "diaozhonghuahong" }, { - "CMYK": [ - 0, - 81, - 18, - 0 - ], - "RGB": [ - 236, - 78, - 138 - ], + "CMYK": [0, 81, 18, 0], + "RGB": [236, 78, 138], "hex": "#ec4e8a", "name": "兔眼红", "pinyin": "tuyanhong" }, { - "CMYK": [ - 0, - 87, - 24, - 0 - ], - "RGB": [ - 238, - 44, - 121 - ], + "CMYK": [0, 87, 24, 0], + "RGB": [238, 44, 121], "hex": "#ee2c79", "name": "紫荆红", "pinyin": "zijinghong" }, { - "CMYK": [ - 24, - 99, - 52, - 19 - ], - "RGB": [ - 149, - 28, - 72 - ], + "CMYK": [24, 99, 52, 19], + "RGB": [149, 28, 72], "hex": "#951c48", "name": "菜头紫", "pinyin": "caitouzi" }, { - "CMYK": [ - 34, - 97, - 54, - 50 - ], - "RGB": [ - 98, - 29, - 52 - ], + "CMYK": [34, 97, 54, 50], + "RGB": [98, 29, 52], "hex": "#621d34", "name": "鹞冠紫", "pinyin": "yaoguanzi" }, { - "CMYK": [ - 33, - 100, - 58, - 60 - ], - "RGB": [ - 98, - 16, - 46 - ], + "CMYK": [33, 100, 58, 60], + "RGB": [98, 16, 46], "hex": "#62102e", "name": "葡萄酒红", "pinyin": "putaojiuhong" }, { - "CMYK": [ - 53, - 81, - 50, - 74 - ], - "RGB": [ - 56, - 33, - 41 - ], + "CMYK": [53, 81, 50, 74], + "RGB": [56, 33, 41], "hex": "#382129", "name": "磨石紫", "pinyin": "moshizi" }, { - "CMYK": [ - 48, - 90, - 50, - 76 - ], - "RGB": [ - 56, - 25, - 36 - ], + "CMYK": [48, 90, 50, 76], + "RGB": [56, 25, 36], "hex": "#381924", "name": "檀紫", "pinyin": "tanzi" }, { - "CMYK": [ - 50, - 91, - 54, - 79 - ], - "RGB": [ - 51, - 20, - 30 - ], + "CMYK": [50, 91, 54, 79], + "RGB": [51, 20, 30], "hex": "#33141e", "name": "火鹅紫", "pinyin": "huoezi" }, { - "CMYK": [ - 53, - 92, - 55, - 81 - ], - "RGB": [ - 49, - 15, - 27 - ], + "CMYK": [53, 92, 55, 81], + "RGB": [49, 15, 27], "hex": "#310f1b", "name": "墨紫", "pinyin": "mozi" }, { - "CMYK": [ - 0, - 48, - 15, - 0 - ], - "RGB": [ - 238, - 166, - 183 - ], + "CMYK": [0, 48, 15, 0], + "RGB": [238, 166, 183], "hex": "#eea6b7", "name": "晶红", "pinyin": "jinghong" }, { - "CMYK": [ - 0, - 82, - 16, - 0 - ], - "RGB": [ - 239, - 73, - 139 - ], + "CMYK": [0, 82, 16, 0], + "RGB": [239, 73, 139], "hex": "#ef498b", "name": "扁豆花红", "pinyin": "biandouhuahong" }, { - "CMYK": [ - 2, - 66, - 22, - 0 - ], - "RGB": [ - 222, - 120, - 151 - ], + "CMYK": [2, 66, 22, 0], + "RGB": [222, 120, 151], "hex": "#de7897", "name": "白芨红", "pinyin": "baijihong" }, { - "CMYK": [ - 0, - 85, - 24, - 0 - ], - "RGB": [ - 222, - 63, - 124 - ], + "CMYK": [0, 85, 24, 0], + "RGB": [222, 63, 124], "hex": "#de3f7c", "name": "嫩菱红", "pinyin": "nenlinghong" }, { - "CMYK": [ - 5, - 87, - 30, - 1 - ], - "RGB": [ - 209, - 60, - 116 - ], + "CMYK": [5, 87, 30, 1], + "RGB": [209, 60, 116], "hex": "#d13c74", "name": "菠根红", "pinyin": "bogenhong" }, { - "CMYK": [ - 15, - 68, - 28, - 2 - ], - "RGB": [ - 197, - 112, - 139 - ], + "CMYK": [15, 68, 28, 2], + "RGB": [197, 112, 139], "hex": "#c5708b", "name": "酢酱草红", "pinyin": "cujiangcaohong" }, { - "CMYK": [ - 22, - 83, - 34, - 11 - ], - "RGB": [ - 168, - 69, - 107 - ], + "CMYK": [22, 83, 34, 11], + "RGB": [168, 69, 107], "hex": "#a8456b", "name": "洋葱紫", "pinyin": "yangcongzi" }, { - "CMYK": [ - 40, - 92, - 47, - 64 - ], - "RGB": [ - 75, - 30, - 47 - ], + "CMYK": [40, 92, 47, 64], + "RGB": [75, 30, 47], "hex": "#4b1e2f", "name": "海象紫", "pinyin": "haixiangzi" }, { - "CMYK": [ - 41, - 97, - 49, - 68 - ], - "RGB": [ - 70, - 22, - 41 - ], + "CMYK": [41, 97, 49, 68], + "RGB": [70, 22, 41], "hex": "#461629", "name": "绀紫", "pinyin": "ganzi" }, { - "CMYK": [ - 42, - 99, - 51, - 69 - ], - "RGB": [ - 68, - 14, - 37 - ], + "CMYK": [42, 99, 51, 69], + "RGB": [68, 14, 37], "hex": "#440e25", "name": "古铜紫", "pinyin": "gutongzi" }, { - "CMYK": [ - 0, - 30, - 12, - 0 - ], - "RGB": [ - 240, - 201, - 207 - ], + "CMYK": [0, 30, 12, 0], + "RGB": [240, 201, 207], "hex": "#f0c9cf", "name": "石蕊红", "pinyin": "shiruihong" }, { - "CMYK": [ - 0, - 50, - 16, - 0 - ], - "RGB": [ - 235, - 160, - 179 - ], + "CMYK": [0, 50, 16, 0], + "RGB": [235, 160, 179], "hex": "#eba0b3", "name": "芍药耕红", "pinyin": "shaoyaogenghong" }, { - "CMYK": [ - 0, - 88, - 23, - 0 - ], - "RGB": [ - 236, - 45, - 122 - ], + "CMYK": [0, 88, 23, 0], + "RGB": [236, 45, 122], "hex": "#ec2d7a", "name": "藏花红", "pinyin": "canghuahong" }, { - "CMYK": [ - 0, - 71, - 18, - 0 - ], - "RGB": [ - 225, - 108, - 150 - ], + "CMYK": [0, 71, 18, 0], + "RGB": [225, 108, 150], "hex": "#e16c96", "name": "初荷红", "pinyin": "chuhehong" }, { - "CMYK": [ - 6, - 13, - 7, - 0 - ], - "RGB": [ - 237, - 227, - 231 - ], + "CMYK": [6, 13, 7, 0], + "RGB": [237, 227, 231], "hex": "#ede3e7", "name": "马鞭草紫", "pinyin": "mabiancaozi" }, { - "CMYK": [ - 7, - 20, - 8, - 0 - ], - "RGB": [ - 233, - 215, - 223 - ], + "CMYK": [7, 20, 8, 0], + "RGB": [233, 215, 223], "hex": "#e9d7df", "name": "丁香淡紫", "pinyin": "dingxiangdanzi" }, { - "CMYK": [ - 7, - 79, - 18, - 0 - ], - "RGB": [ - 210, - 86, - 140 - ], + "CMYK": [7, 79, 18, 0], + "RGB": [210, 86, 140], "hex": "#d2568c", "name": "丹紫红", "pinyin": "danzihong" }, { - "CMYK": [ - 4, - 89, - 21, - 0 - ], - "RGB": [ - 210, - 53, - 125 - ], + "CMYK": [4, 89, 21, 0], + "RGB": [210, 53, 125], "hex": "#d2357d", "name": "玫瑰红", "pinyin": "meiguihong" }, { - "CMYK": [ - 19, - 27, - 9, - 0 - ], - "RGB": [ - 209, - 194, - 211 - ], + "CMYK": [19, 27, 9, 0], + "RGB": [209, 194, 211], "hex": "#d1c2d3", "name": "淡牵牛紫", "pinyin": "danqianniuzi" }, { - "CMYK": [ - 21, - 37, - 12, - 0 - ], - "RGB": [ - 200, - 173, - 196 - ], + "CMYK": [21, 37, 12, 0], + "RGB": [200, 173, 196], "hex": "#c8adc4", "name": "凤信紫", "pinyin": "fengxinzi" }, { - "CMYK": [ - 23, - 53, - 14, - 1 - ], - "RGB": [ - 192, - 142, - 175 - ], + "CMYK": [23, 53, 14, 1], + "RGB": [192, 142, 175], "hex": "#c08eaf", "name": "萝兰紫", "pinyin": "luolanzi" }, { - "CMYK": [ - 18, - 91, - 18, - 2 - ], - "RGB": [ - 186, - 47, - 123 - ], + "CMYK": [18, 91, 18, 2], + "RGB": [186, 47, 123], "hex": "#ba2f7b", "name": "玫瑰紫", "pinyin": "meiguizi" }, { - "CMYK": [ - 58, - 56, - 17, - 2 - ], - "RGB": [ - 128, - 118, - 163 - ], + "CMYK": [58, 56, 17, 2], + "RGB": [128, 118, 163], "hex": "#8076a3", "name": "藤萝紫", "pinyin": "tengluozi" }, { - "CMYK": [ - 57, - 62, - 16, - 2 - ], - "RGB": [ - 128, - 109, - 158 - ], + "CMYK": [57, 62, 16, 2], + "RGB": [128, 109, 158], "hex": "#806d9e", "name": "槿紫", "pinyin": "jinzi" }, { - "CMYK": [ - 56, - 72, - 15, - 1 - ], - "RGB": [ - 129, - 92, - 148 - ], + "CMYK": [56, 72, 15, 1], + "RGB": [129, 92, 148], "hex": "#815c94", "name": "蕈紫", "pinyin": "xunzi" }, { - "CMYK": [ - 54, - 89, - 12, - 1 - ], - "RGB": [ - 129, - 60, - 133 - ], + "CMYK": [54, 89, 12, 1], + "RGB": [129, 60, 133], "hex": "#813c85", "name": "桔梗紫", "pinyin": "jiegengzi" }, { - "CMYK": [ - 52, - 100, - 17, - 7 - ], - "RGB": [ - 126, - 22, - 113 - ], + "CMYK": [52, 100, 17, 7], + "RGB": [126, 22, 113], "hex": "#7e1671", "name": "魏紫", "pinyin": "weizi" }, { - "CMYK": [ - 3, - 26, - 10, - 0 - ], - "RGB": [ - 233, - 204, - 211 - ], + "CMYK": [3, 26, 10, 0], + "RGB": [233, 204, 211], "hex": "#e9ccd3", "name": "芝兰紫", "pinyin": "zhilanzi" }, { - "CMYK": [ - 10, - 67, - 12, - 0 - ], - "RGB": [ - 210, - 118, - 163 - ], + "CMYK": [10, 67, 12, 0], + "RGB": [210, 118, 163], "hex": "#d276a3", "name": "菱锰红", "pinyin": "lingmenghong" }, { - "CMYK": [ - 11, - 97, - 10, - 0 - ], - "RGB": [ - 204, - 85, - 149 - ], + "CMYK": [11, 97, 10, 0], + "RGB": [204, 85, 149], "hex": "#cc5595", "name": "龙须红", "pinyin": "longxuhong" }, { - "CMYK": [ - 8, - 22, - 12, - 0 - ], - "RGB": [ - 230, - 210, - 213 - ], + "CMYK": [8, 22, 12, 0], + "RGB": [230, 210, 213], "hex": "#e6d2d5", "name": "蓟粉红", "pinyin": "jifenhong" }, { - "CMYK": [ - 16, - 79, - 14, - 1 - ], - "RGB": [ - 195, - 86, - 145 - ], + "CMYK": [16, 79, 14, 1], + "RGB": [195, 86, 145], "hex": "#c35691", "name": "电气石红", "pinyin": "dianqishihong" }, { - "CMYK": [ - 19, - 68, - 18, - 1 - ], - "RGB": [ - 192, - 111, - 152 - ], + "CMYK": [19, 68, 18, 1], + "RGB": [192, 111, 152], "hex": "#c06f98", "name": "樱草紫", "pinyin": "yingcaozi" }, { - "CMYK": [ - 25, - 31, - 26, - 5 - ], - "RGB": [ - 189, - 174, - 173 - ], + "CMYK": [25, 31, 26, 5], + "RGB": [189, 174, 173], "hex": "#bdaead", "name": "芦穗灰", "pinyin": "lusuihui" }, { - "CMYK": [ - 26, - 43, - 26, - 6 - ], - "RGB": [ - 181, - 152, - 161 - ], + "CMYK": [26, 43, 26, 6], + "RGB": [181, 152, 161], "hex": "#b598a1", "name": "隐红灰", "pinyin": "yinhonghui" }, { - "CMYK": [ - 27, - 97, - 27, - 14 - ], - "RGB": [ - 155, - 30, - 100 - ], + "CMYK": [27, 97, 27, 14], + "RGB": [155, 30, 100], "hex": "#9b1e64", "name": "苋菜紫", "pinyin": "xiancaizi" }, { - "CMYK": [ - 39, - 53, - 38, - 25 - ], - "RGB": [ - 133, - 109, - 114 - ], + "CMYK": [39, 53, 38, 25], + "RGB": [133, 109, 114], "hex": "#856d72", "name": "芦灰", "pinyin": "luhui" }, { - "CMYK": [ - 49, - 71, - 49, - 58 - ], - "RGB": [ - 79, - 56, - 62 - ], + "CMYK": [49, 71, 49, 58], + "RGB": [79, 56, 62], "hex": "#4f383e", "name": "暮云灰", "pinyin": "muyunhui" }, { - "CMYK": [ - 49, - 82, - 46, - 63 - ], - "RGB": [ - 72, - 41, - 54 - ], + "CMYK": [49, 82, 46, 63], + "RGB": [72, 41, 54], "hex": "#482936", "name": "斑鸠灰", "pinyin": "banjiuhui" }, { - "CMYK": [ - 4, - 11, - 9, - 0 - ], - "RGB": [ - 242, - 231, - 229 - ], + "CMYK": [4, 11, 9, 0], + "RGB": [242, 231, 229], "hex": "#f2e7e5", "name": "淡藤萝紫", "pinyin": "dantengluozi" }, { - "CMYK": [ - 10, - 27, - 11, - 0 - ], - "RGB": [ - 224, - 200, - 209 - ], + "CMYK": [10, 27, 11, 0], + "RGB": [224, 200, 209], "hex": "#e0c8d1", "name": "淡青紫", "pinyin": "danqingzi" }, { - "CMYK": [ - 24, - 58, - 15, - 1 - ], - "RGB": [ - 188, - 132, - 168 - ], + "CMYK": [24, 58, 15, 1], + "RGB": [188, 132, 168], "hex": "#bc84a8", "name": "青蛤壳紫", "pinyin": "qinghakezi" }, { - "CMYK": [ - 31, - 71, - 15, - 1 - ], - "RGB": [ - 173, - 101, - 152 - ], + "CMYK": [31, 71, 15, 1], + "RGB": [173, 101, 152], "hex": "#ad6598", "name": "豆蔻紫", "pinyin": "doukouzi" }, { - "CMYK": [ - 35, - 75, - 18, - 2 - ], - "RGB": [ - 163, - 92, - 143 - ], + "CMYK": [35, 75, 18, 2], + "RGB": [163, 92, 143], "hex": "#a35c8f", "name": "扁豆紫", "pinyin": "biandouzi" }, { - "CMYK": [ - 39, - 91, - 15, - 3 - ], - "RGB": [ - 152, - 54, - 128 - ], + "CMYK": [39, 91, 15, 3], + "RGB": [152, 54, 128], "hex": "#983680", "name": "芥花紫", "pinyin": "jiehuazi" }, { - "CMYK": [ - 43, - 97, - 19, - 8 - ], - "RGB": [ - 139, - 38, - 113 - ], + "CMYK": [43, 97, 19, 8], + "RGB": [139, 38, 113], "hex": "#8b2671", "name": "青莲", "pinyin": "qinglian" }, { - "CMYK": [ - 44, - 85, - 24, - 10 - ], - "RGB": [ - 137, - 66, - 118 - ], + "CMYK": [44, 85, 24, 10], + "RGB": [137, 66, 118], "hex": "#894276", "name": "芓紫", "pinyin": "zizi" }, { - "CMYK": [ - 45, - 99, - 24, - 16 - ], - "RGB": [ - 126, - 32, - 101 - ], + "CMYK": [45, 99, 24, 16], + "RGB": [126, 32, 101], "hex": "#7e2065", "name": "葛巾紫", "pinyin": "gejinzi" }, { - "CMYK": [ - 49, - 100, - 29, - 32 - ], - "RGB": [ - 104, - 23, - 82 - ], + "CMYK": [49, 100, 29, 32], + "RGB": [104, 23, 82], "hex": "#681752", "name": "牵牛紫", "pinyin": "qianniuzi" }, { - "CMYK": [ - 53, - 75, - 41, - 41 - ], - "RGB": [ - 93, - 63, - 81 - ], + "CMYK": [53, 75, 41, 41], + "RGB": [93, 63, 81], "hex": "#5d3f51", "name": "紫灰", "pinyin": "zihui" }, { - "CMYK": [ - 55, - 87, - 41, - 52 - ], - "RGB": [ - 78, - 42, - 64 - ], + "CMYK": [55, 87, 41, 52], + "RGB": [78, 42, 64], "hex": "#4e2a40", "name": "龙睛鱼紫", "pinyin": "longjingyuzi" }, { - "CMYK": [ - 58, - 96, - 40, - 61 - ], - "RGB": [ - 65, - 28, - 53 - ], + "CMYK": [58, 96, 40, 61], + "RGB": [65, 28, 53], "hex": "#411c35", "name": "荸荠紫", "pinyin": "biqizi" }, { - "CMYK": [ - 63, - 74, - 52, - 70 - ], - "RGB": [ - 54, - 41, - 47 - ], + "CMYK": [63, 74, 52, 70], + "RGB": [54, 41, 47], "hex": "#36292f", "name": "古鼎灰", "pinyin": "gudinghui" }, { - "CMYK": [ - 81, - 87, - 54, - 84 - ], - "RGB": [ - 30, - 19, - 29 - ], + "CMYK": [81, 87, 54, 84], + "RGB": [30, 19, 29], "hex": "#1e131d", "name": "乌梅紫", "pinyin": "wumeizi" }, { - "CMYK": [ - 83, - 87, - 55, - 86 - ], - "RGB": [ - 28, - 13, - 26 - ], + "CMYK": [83, 87, 55, 86], + "RGB": [28, 13, 26], "hex": "#1c0d1a", "name": "深牵牛紫", "pinyin": "shenqianniuzi" }, { - "CMYK": [ - 7, - 5, - 7, - 0 - ], - "RGB": [ - 241, - 240, - 237 - ], + "CMYK": [7, 5, 7, 0], + "RGB": [241, 240, 237], "hex": "#f1f0ed", "name": "银白", "pinyin": "yinbai" }, { - "CMYK": [ - 13, - 10, - 9, - 0 - ], - "RGB": [ - 226, - 225, - 228 - ], + "CMYK": [13, 10, 9, 0], + "RGB": [226, 225, 228], "hex": "#e2e1e4", "name": "芡食白", "pinyin": "qianshibai" }, { - "CMYK": [ - 23, - 18, - 12, - 1 - ], - "RGB": [ - 204, - 204, - 214 - ], + "CMYK": [23, 18, 12, 1], + "RGB": [204, 204, 214], "hex": "#ccccd6", "name": "远山紫", "pinyin": "yuanshanzi" }, { - "CMYK": [ - 39, - 31, - 17, - 2 - ], - "RGB": [ - 167, - 168, - 189 - ], + "CMYK": [39, 31, 17, 2], + "RGB": [167, 168, 189], "hex": "#a7a8bd", "name": "淡蓝紫", "pinyin": "danlanzi" }, { - "CMYK": [ - 74, - 64, - 14, - 1 - ], - "RGB": [ - 97, - 100, - 159 - ], + "CMYK": [74, 64, 14, 1], + "RGB": [97, 100, 159], "hex": "#61649f", "name": "山梗紫", "pinyin": "shangengzi" }, { - "CMYK": [ - 63, - 53, - 22, - 5 - ], - "RGB": [ - 116, - 117, - 155 - ], + "CMYK": [63, 53, 22, 5], + "RGB": [116, 117, 155], "hex": "#74759b", "name": "螺甸紫", "pinyin": "luodianzi" }, { - "CMYK": [ - 21, - 17, - 19, - 1 - ], - "RGB": [ - 207, - 204, - 201 - ], + "CMYK": [21, 17, 19, 1], + "RGB": [207, 204, 201], "hex": "#cfccc9", "name": "玛瑙灰", "pinyin": "manaohui" }, { - "CMYK": [ - 80, - 73, - 21, - 6 - ], - "RGB": [ - 82, - 82, - 136 - ], + "CMYK": [80, 73, 21, 6], + "RGB": [82, 82, 136], "hex": "#525288", "name": "野菊紫", "pinyin": "yejuzi" }, { - "CMYK": [ - 100, - 93, - 21, - 5 - ], - "RGB": [ - 46, - 49, - 124 - ], + "CMYK": [100, 93, 21, 5], + "RGB": [46, 49, 124], "hex": "#2e317c", "name": "满天星紫", "pinyin": "mantianxingzi" }, { - "CMYK": [ - 48, - 45, - 40, - 26 - ], - "RGB": [ - 122, - 115, - 116 - ], + "CMYK": [48, 45, 40, 26], + "RGB": [122, 115, 116], "hex": "#7a7374", "name": "锌灰", "pinyin": "xinhui" }, { - "CMYK": [ - 91, - 84, - 40, - 43 - ], - "RGB": [ - 48, - 47, - 75 - ], + "CMYK": [91, 84, 40, 43], + "RGB": [48, 47, 75], "hex": "#302f4b", "name": "野葡萄紫", "pinyin": "yeputaozi" }, { - "CMYK": [ - 70, - 69, - 49, - 56 - ], - "RGB": [ - 62, - 56, - 65 - ], + "CMYK": [70, 69, 49, 56], + "RGB": [62, 56, 65], "hex": "#3e3841", "name": "剑锋紫", "pinyin": "jianfengzi" }, { - "CMYK": [ - 79, - 74, - 49, - 60 - ], - "RGB": [ - 50, - 47, - 59 - ], + "CMYK": [79, 74, 49, 60], + "RGB": [50, 47, 59], "hex": "#322f3b", "name": "龙葵紫", "pinyin": "longkuizi" }, { - "CMYK": [ - 90, - 84, - 50, - 69 - ], - "RGB": [ - 34, - 32, - 46 - ], + "CMYK": [90, 84, 50, 69], + "RGB": [34, 32, 46], "hex": "#22202e", "name": "暗龙胆紫", "pinyin": "anlongdanzi" }, { - "CMYK": [ - 98, - 93, - 48, - 73 - ], - "RGB": [ - 31, - 32, - 64 - ], + "CMYK": [98, 93, 48, 73], + "RGB": [31, 32, 64], "hex": "#1f2040", "name": "晶石紫", "pinyin": "jingshizi" }, { - "CMYK": [ - 100, - 94, - 52, - 77 - ], - "RGB": [ - 19, - 17, - 36 - ], + "CMYK": [100, 94, 52, 77], + "RGB": [19, 17, 36], "hex": "#131124", "name": "暗蓝紫", "pinyin": "anlanzi" }, { - "CMYK": [ - 95, - 46, - 10, - 1 - ], - "RGB": [ - 39, - 117, - 182 - ], + "CMYK": [95, 46, 10, 1], + "RGB": [39, 117, 182], "hex": "#2775b6", "name": "景泰蓝", "pinyin": "jingtailan" }, { - "CMYK": [ - 96, - 47, - 11, - 1 - ], - "RGB": [ - 36, - 116, - 181 - ], + "CMYK": [96, 47, 11, 1], + "RGB": [36, 116, 181], "hex": "#2474b5", "name": "尼罗蓝", "pinyin": "niluolan" }, { - "CMYK": [ - 25, - 6, - 10, - 0 - ], - "RGB": [ - 208, - 223, - 230 - ], + "CMYK": [25, 6, 10, 0], + "RGB": [208, 223, 230], "hex": "#d0dfe6", "name": "远天蓝", "pinyin": "yuantianlan" }, { - "CMYK": [ - 53, - 19, - 15, - 1 - ], - "RGB": [ - 147, - 181, - 207 - ], + "CMYK": [53, 19, 15, 1], + "RGB": [147, 181, 207], "hex": "#93b5cf", "name": "星蓝", "pinyin": "xinglan" }, { - "CMYK": [ - 74, - 27, - 16, - 2 - ], - "RGB": [ - 97, - 154, - 195 - ], + "CMYK": [74, 27, 16, 2], + "RGB": [97, 154, 195], "hex": "#619ac3", "name": "羽扇豆蓝", "pinyin": "yushandoulan" }, { - "CMYK": [ - 95, - 45, - 10, - 1 - ], - "RGB": [ - 35, - 118, - 183 - ], + "CMYK": [95, 45, 10, 1], + "RGB": [35, 118, 183], "hex": "#2376b7", "name": "花青", "pinyin": "huaqing" }, { - "CMYK": [ - 78, - 27, - 17, - 2 - ], - "RGB": [ - 86, - 152, - 195 - ], + "CMYK": [78, 27, 17, 2], + "RGB": [86, 152, 195], "hex": "#5698c3", "name": "睛蓝", "pinyin": "jinglan" }, { - "CMYK": [ - 99, - 44, - 10, - 1 - ], - "RGB": [ - 33, - 119, - 184 - ], + "CMYK": [99, 44, 10, 1], + "RGB": [33, 119, 184], "hex": "#2177b8", "name": "虹蓝", "pinyin": "honglan" }, { - "CMYK": [ - 43, - 4, - 16, - 0 - ], - "RGB": [ - 176, - 213, - 223 - ], + "CMYK": [43, 4, 16, 0], + "RGB": [176, 213, 223], "hex": "#b0d5df", "name": "湖水蓝", "pinyin": "hushuilan" }, { - "CMYK": [ - 59, - 12, - 19, - 0 - ], - "RGB": [ - 138, - 188, - 209 - ], + "CMYK": [59, 12, 19, 0], + "RGB": [138, 188, 209], "hex": "#8abcd1", "name": "秋波蓝", "pinyin": "qiubolan" }, { - "CMYK": [ - 73, - 17, - 20, - 1 - ], - "RGB": [ - 102, - 169, - 201 - ], + "CMYK": [73, 17, 20, 1], + "RGB": [102, 169, 201], "hex": "#66a9c9", "name": "涧石蓝", "pinyin": "jianshilan" }, { - "CMYK": [ - 93, - 36, - 15, - 2 - ], - "RGB": [ - 41, - 131, - 187 - ], + "CMYK": [93, 36, 15, 2], + "RGB": [41, 131, 187], "hex": "#2983bb", "name": "潮蓝", "pinyin": "chaolan" }, { - "CMYK": [ - 99, - 48, - 11, - 1 - ], - "RGB": [ - 23, - 114, - 180 - ], + "CMYK": [99, 48, 11, 1], + "RGB": [23, 114, 180], "hex": "#1772b4", "name": "群青", "pinyin": "qunqing" }, { - "CMYK": [ - 74, - 2, - 24, - 0 - ], - "RGB": [ - 99, - 187, - 208 - ], + "CMYK": [74, 2, 24, 0], + "RGB": [99, 187, 208], "hex": "#63bbd0", "name": "霁青", "pinyin": "jiqing" }, { - "CMYK": [ - 77, - 7, - 24, - 0 - ], - "RGB": [ - 92, - 179, - 204 - ], + "CMYK": [77, 7, 24, 0], + "RGB": [92, 179, 204], "hex": "#5cb3cc", "name": "碧青", "pinyin": "biqing" }, { - "CMYK": [ - 94, - 32, - 17, - 3 - ], - "RGB": [ - 36, - 134, - 185 - ], + "CMYK": [94, 32, 17, 3], + "RGB": [36, 134, 185], "hex": "#2486b9", "name": "宝石蓝", "pinyin": "baoshilan" }, { - "CMYK": [ - 98, - 43, - 14, - 2 - ], - "RGB": [ - 22, - 119, - 179 - ], + "CMYK": [98, 43, 14, 2], + "RGB": [22, 119, 179], "hex": "#1677b3", "name": "天蓝", "pinyin": "tianlan" }, { - "CMYK": [ - 100, - 52, - 11, - 1 - ], - "RGB": [ - 18, - 107, - 174 - ], + "CMYK": [100, 52, 11, 1], + "RGB": [18, 107, 174], "hex": "#126bae", "name": "柏林蓝", "pinyin": "bolinlan" }, { - "CMYK": [ - 92, - 10, - 25, - 1 - ], - "RGB": [ - 34, - 162, - 195 - ], + "CMYK": [92, 10, 25, 1], + "RGB": [34, 162, 195], "hex": "#22a2c3", "name": "海青", "pinyin": "haiqing" }, { - "CMYK": [ - 94, - 16, - 23, - 3 - ], - "RGB": [ - 26, - 148, - 188 - ], + "CMYK": [94, 16, 23, 3], + "RGB": [26, 148, 188], "hex": "#1a94bc", "name": "钴蓝", "pinyin": "gulan" }, { - "CMYK": [ - 95, - 25, - 20, - 4 - ], - "RGB": [ - 21, - 139, - 184 - ], + "CMYK": [95, 25, 20, 4], + "RGB": [21, 139, 184], "hex": "#158bb8", "name": "鸢尾蓝", "pinyin": "yuanweilan" }, { - "CMYK": [ - 98, - 42, - 16, - 3 - ], - "RGB": [ - 17, - 119, - 176 - ], + "CMYK": [98, 42, 16, 3], + "RGB": [17, 119, 176], "hex": "#1177b0", "name": "牵牛花蓝", "pinyin": "qianniuhualan" }, { - "CMYK": [ - 100, - 65, - 11, - 1 - ], - "RGB": [ - 15, - 89, - 164 - ], + "CMYK": [100, 65, 11, 1], + "RGB": [15, 89, 164], "hex": "#0f59a4", "name": "飞燕草蓝", "pinyin": "feiyancaolan" }, { - "CMYK": [ - 95, - 47, - 14, - 2 - ], - "RGB": [ - 43, - 115, - 175 - ], + "CMYK": [95, 47, 14, 2], + "RGB": [43, 115, 175], "hex": "#2b73af", "name": "品蓝", "pinyin": "pinlan" }, { - "CMYK": [ - 24, - 14, - 16, - 1 - ], - "RGB": [ - 205, - 209, - 211 - ], + "CMYK": [24, 14, 16, 1], + "RGB": [205, 209, 211], "hex": "#cdd1d3", "name": "银鱼白", "pinyin": "yinyubai" }, { - "CMYK": [ - 93, - 49, - 17, - 3 - ], - "RGB": [ - 49, - 112, - 167 - ], + "CMYK": [93, 49, 17, 3], + "RGB": [49, 112, 167], "hex": "#3170a7", "name": "安安蓝", "pinyin": "ananlan" }, { - "CMYK": [ - 64, - 52, - 39, - 28 - ], - "RGB": [ - 94, - 97, - 109 - ], + "CMYK": [64, 52, 39, 28], + "RGB": [94, 97, 109], "hex": "#5e616d", "name": "鱼尾灰", "pinyin": "yuweihui" }, { - "CMYK": [ - 78, - 60, - 40, - 31 - ], - "RGB": [ - 71, - 81, - 100 - ], + "CMYK": [78, 60, 40, 31], + "RGB": [71, 81, 100], "hex": "#475164", "name": "鲸鱼灰", "pinyin": "jingyuhui" }, { - "CMYK": [ - 69, - 64, - 52, - 59 - ], - "RGB": [ - 255, - 254, - 250 - ], + "CMYK": [69, 64, 52, 59], + "RGB": [255, 254, 250], "hex": "#fffefa", "name": "海参灰", "pinyin": "haishenhui" }, { - "CMYK": [ - 76, - 70, - 51, - 60 - ], - "RGB": [ - 53, - 51, - 60 - ], + "CMYK": [76, 70, 51, 60], + "RGB": [53, 51, 60], "hex": "#35333c", "name": "沙鱼灰", "pinyin": "shayuhui" }, { - "CMYK": [ - 100, - 89, - 54, - 79 - ], - "RGB": [ - 15, - 20, - 35 - ], + "CMYK": [100, 89, 54, 79], + "RGB": [15, 20, 35], "hex": "#0f1423", "name": "钢蓝", "pinyin": "ganglan" }, { - "CMYK": [ - 35, - 13, - 13, - 0 - ], - "RGB": [ - 186, - 204, - 217 - ], + "CMYK": [35, 13, 13, 0], + "RGB": [186, 204, 217], "hex": "#baccd9", "name": "云水蓝", "pinyin": "yunshuilan" }, { - "CMYK": [ - 55, - 20, - 18, - 1 - ], - "RGB": [ - 143, - 178, - 201 - ], + "CMYK": [55, 20, 18, 1], + "RGB": [143, 178, 201], "hex": "#8fb2c9", "name": "晴山蓝", "pinyin": "qingshanlan" }, { - "CMYK": [ - 100, - 60, - 8, - 1 - ], - "RGB": [ - 22, - 97, - 171 - ], + "CMYK": [100, 60, 8, 1], + "RGB": [22, 97, 171], "hex": "#1661ab", "name": "靛青", "pinyin": "dianqing" }, { - "CMYK": [ - 29, - 16, - 17, - 1 - ], - "RGB": [ - 196, - 203, - 207 - ], + "CMYK": [29, 16, 17, 1], + "RGB": [196, 203, 207], "hex": "#c4cbcf", "name": "大理石灰", "pinyin": "dalishihui" }, { - "CMYK": [ - 100, - 67, - 16, - 3 - ], - "RGB": [ - 21, - 85, - 154 - ], + "CMYK": [100, 67, 16, 3], + "RGB": [21, 85, 154], "hex": "#15559a", "name": "海涛蓝", "pinyin": "haitaolan" }, { - "CMYK": [ - 81, - 41, - 24, - 8 - ], - "RGB": [ - 78, - 124, - 161 - ], + "CMYK": [81, 41, 24, 8], + "RGB": [78, 124, 161], "hex": "#4e7ca1", "name": "蝶翅蓝", "pinyin": "diechilan" }, { - "CMYK": [ - 93, - 50, - 21, - 6 - ], - "RGB": [ - 52, - 108, - 156 - ], + "CMYK": [93, 50, 21, 6], + "RGB": [52, 108, 156], "hex": "#346c9c", "name": "海军蓝", "pinyin": "haijunlan" }, { - "CMYK": [ - 77, - 68, - 54, - 66 - ], - "RGB": [ - 47, - 47, - 53 - ], + "CMYK": [77, 68, 54, 66], + "RGB": [47, 47, 53], "hex": "#2f2f35", "name": "水牛灰", "pinyin": "shuiniuhui" }, { - "CMYK": [ - 80, - 70, - 53, - 65 - ], - "RGB": [ - 45, - 46, - 54 - ], + "CMYK": [80, 70, 53, 65], + "RGB": [45, 46, 54], "hex": "#2d2e36", "name": "牛角灰", "pinyin": "niujiaohui" }, { - "CMYK": [ - 100, - 86, - 54, - 78 - ], - "RGB": [ - 19, - 24, - 36 - ], + "CMYK": [100, 86, 54, 78], + "RGB": [19, 24, 36], "hex": "#131824", "name": "燕颔蓝", "pinyin": "yanhanlan" }, { - "CMYK": [ - 21, - 6, - 10, - 0 - ], - "RGB": [ - 216, - 227, - 231 - ], + "CMYK": [21, 6, 10, 0], + "RGB": [216, 227, 231], "hex": "#d8e3e7", "name": "云峰白", "pinyin": "yunfengbai" }, { - "CMYK": [ - 32, - 8, - 13, - 0 - ], - "RGB": [ - 195, - 215, - 223 - ], + "CMYK": [32, 8, 13, 0], + "RGB": [195, 215, 223], "hex": "#c3d7df", "name": "井天蓝", "pinyin": "jingtianlan" }, { - "CMYK": [ - 91, - 24, - 22, - 4 - ], - "RGB": [ - 47, - 144, - 185 - ], + "CMYK": [91, 24, 22, 4], + "RGB": [47, 144, 185], "hex": "#2f90b9", "name": "云山蓝", "pinyin": "yunshanlan" }, { - "CMYK": [ - 96, - 34, - 18, - 4 - ], - "RGB": [ - 23, - 129, - 181 - ], + "CMYK": [96, 34, 18, 4], + "RGB": [23, 129, 181], "hex": "#1781b5", "name": "釉蓝", "pinyin": "youlan" }, { - "CMYK": [ - 28, - 12, - 17, - 0 - ], - "RGB": [ - 199, - 210, - 212 - ], + "CMYK": [28, 12, 17, 0], + "RGB": [199, 210, 212], "hex": "#c7d2d4", "name": "鸥蓝", "pinyin": "oulan" }, { - "CMYK": [ - 100, - 53, - 21, - 6 - ], - "RGB": [ - 17, - 101, - 154 - ], + "CMYK": [100, 53, 21, 6], + "RGB": [17, 101, 154], "hex": "#11659a", "name": "搪磁蓝", "pinyin": "tangcilan" }, { - "CMYK": [ - 29, - 18, - 21, - 2 - ], - "RGB": [ - 192, - 196, - 195 - ], + "CMYK": [29, 18, 21, 2], + "RGB": [192, 196, 195], "hex": "#c0c4c3", "name": "月影白", "pinyin": "yueyingbai" }, { - "CMYK": [ - 36, - 20, - 23, - 2 - ], - "RGB": [ - 178, - 187, - 190 - ], + "CMYK": [36, 20, 23, 2], + "RGB": [178, 187, 190], "hex": "#b2bbbe", "name": "星灰", "pinyin": "xinghui" }, { - "CMYK": [ - 70, - 38, - 36, - 18 - ], - "RGB": [ - 94, - 121, - 135 - ], + "CMYK": [70, 38, 36, 18], + "RGB": [94, 121, 135], "hex": "#5e7987", "name": "淡蓝灰", "pinyin": "danlanhui" }, { - "CMYK": [ - 100, - 68, - 32, - 20 - ], - "RGB": [ - 20, - 74, - 116 - ], + "CMYK": [100, 68, 32, 20], + "RGB": [20, 74, 116], "hex": "#144a74", "name": "鷃蓝", "pinyin": "yanlan" }, { - "CMYK": [ - 55, - 40, - 40, - 23 - ], - "RGB": [ - 116, - 120, - 122 - ], + "CMYK": [55, 40, 40, 23], + "RGB": [116, 120, 122], "hex": "#74787a", "name": "嫩灰", "pinyin": "nenhui" }, { - "CMYK": [ - 77, - 50, - 41, - 31 - ], - "RGB": [ - 73, - 92, - 105 - ], + "CMYK": [77, 50, 41, 31], + "RGB": [73, 92, 105], "hex": "#495c69", "name": "战舰灰", "pinyin": "zhanjianhui" }, { - "CMYK": [ - 67, - 57, - 49, - 49 - ], - "RGB": [ - 71, - 72, - 76 - ], + "CMYK": [67, 57, 49, 49], + "RGB": [71, 72, 76], "hex": "#47484c", "name": "瓦罐灰", "pinyin": "waguanhui" }, { - "CMYK": [ - 87, - 69, - 51, - 58 - ], - "RGB": [ - 43, - 51, - 62 - ], + "CMYK": [87, 69, 51, 58], + "RGB": [43, 51, 62], "hex": "#2b333e", "name": "青灰", "pinyin": "qinghui" }, { - "CMYK": [ - 100, - 77, - 50, - 62 - ], - "RGB": [ - 28, - 41, - 56 - ], + "CMYK": [100, 77, 50, 62], + "RGB": [28, 41, 56], "hex": "#1c2938", "name": "鸽蓝", "pinyin": "gelan" }, { - "CMYK": [ - 100, - 82, - 51, - 64 - ], - "RGB": [ - 20, - 35, - 52 - ], + "CMYK": [100, 82, 51, 64], + "RGB": [20, 35, 52], "hex": "#142334", "name": "钢青", "pinyin": "gangqing" }, { - "CMYK": [ - 100, - 84, - 51, - 68 - ], - "RGB": [ - 16, - 31, - 48 - ], + "CMYK": [100, 84, 51, 68], + "RGB": [16, 31, 48], "hex": "#101f30", "name": "暗蓝", "pinyin": "anlan" }, { - "CMYK": [ - 11, - 0, - 8, - 0 - ], - "RGB": [ - 238, - 247, - 242 - ], + "CMYK": [11, 0, 8, 0], + "RGB": [238, 247, 242], "hex": "#eef7f2", "name": "月白", "pinyin": "yuebai" }, { - "CMYK": [ - 33, - 0, - 14, - 0 - ], - "RGB": [ - 198, - 230, - 232 - ], + "CMYK": [33, 0, 14, 0], + "RGB": [198, 230, 232], "hex": "#c6e6e8", "name": "海天蓝", "pinyin": "haitianlan" }, { - "CMYK": [ - 57, - 0, - 22, - 0 - ], - "RGB": [ - 147, - 213, - 220 - ], + "CMYK": [57, 0, 22, 0], + "RGB": [147, 213, 220], "hex": "#93d5dc", "name": "清水蓝", "pinyin": "qingshuilan" }, { - "CMYK": [ - 79, - 0, - 27, - 0 - ], - "RGB": [ - 81, - 196, - 211 - ], + "CMYK": [79, 0, 27, 0], + "RGB": [81, 196, 211], "hex": "#51c4d3", "name": "瀑布蓝", "pinyin": "pubulan" }, { - "CMYK": [ - 89, - 0, - 29, - 0 - ], - "RGB": [ - 41, - 183, - 203 - ], + "CMYK": [89, 0, 29, 0], + "RGB": [41, 183, 203], "hex": "#29b7cb", "name": "蔚蓝", "pinyin": "weilan" }, { - "CMYK": [ - 92, - 0, - 28, - 0 - ], - "RGB": [ - 14, - 176, - 201 - ], + "CMYK": [92, 0, 28, 0], + "RGB": [14, 176, 201], "hex": "#0eb0c9", "name": "孔雀蓝", "pinyin": "kongquelan" }, { - "CMYK": [ - 93, - 0, - 31, - 0 - ], - "RGB": [ - 16, - 174, - 194 - ], + "CMYK": [93, 0, 31, 0], + "RGB": [16, 174, 194], "hex": "#10aec2", "name": "甸子蓝", "pinyin": "dianzilan" }, { - "CMYK": [ - 78, - 36, - 0, - 0 - ], - "RGB": [ - 87, - 195, - 194 - ], + "CMYK": [78, 36, 0, 0], + "RGB": [87, 195, 194], "hex": "#57c3c2", "name": "石绿", "pinyin": "shilv" }, { - "CMYK": [ - 40, - 0, - 30, - 0 - ], - "RGB": [ - 185, - 222, - 201 - ], + "CMYK": [40, 0, 30, 0], + "RGB": [185, 222, 201], "hex": "#b9dec9", "name": "竹篁绿", "pinyin": "zhuhuanglv" }, { - "CMYK": [ - 64, - 0, - 46, - 0 - ], - "RGB": [ - 131, - 203, - 172 - ], + "CMYK": [64, 0, 46, 0], + "RGB": [131, 203, 172], "hex": "#83cbac", "name": "粉绿", "pinyin": "fenlv" }, { - "CMYK": [ - 95, - 0, - 52, - 0 - ], - "RGB": [ - 18, - 170, - 156 - ], + "CMYK": [95, 0, 52, 0], + "RGB": [18, 170, 156], "hex": "#12aa9c", "name": "美蝶绿", "pinyin": "meidielv" }, { - "CMYK": [ - 75, - 0, - 61, - 0 - ], - "RGB": [ - 102, - 193, - 140 - ], + "CMYK": [75, 0, 61, 0], + "RGB": [102, 193, 140], "hex": "#66c18c", "name": "毛绿", "pinyin": "maolv" }, { - "CMYK": [ - 78, - 0, - 62, - 0 - ], - "RGB": [ - 93, - 190, - 138 - ], + "CMYK": [78, 0, 62, 0], + "RGB": [93, 190, 138], "hex": "#5dbe8a", "name": "蔻梢绿", "pinyin": "koushaolv" }, { - "CMYK": [ - 81, - 0, - 62, - 0 - ], - "RGB": [ - 85, - 187, - 138 - ], + "CMYK": [81, 0, 62, 0], + "RGB": [85, 187, 138], "hex": "#55bb8a", "name": "麦苗绿", "pinyin": "maimiaolv" }, { - "CMYK": [ - 86, - 0, - 63, - 0 - ], - "RGB": [ - 69, - 183, - 135 - ], + "CMYK": [86, 0, 63, 0], + "RGB": [69, 183, 135], "hex": "#45b787", "name": "蛙绿", "pinyin": "walv" }, { - "CMYK": [ - 92, - 0, - 64, - 0 - ], - "RGB": [ - 43, - 174, - 133 - ], + "CMYK": [92, 0, 64, 0], + "RGB": [43, 174, 133], "hex": "#2bae85", "name": "铜绿", "pinyin": "tonglv" }, { - "CMYK": [ - 96, - 0, - 64, - 0 - ], - "RGB": [ - 27, - 167, - 132 - ], + "CMYK": [96, 0, 64, 0], + "RGB": [27, 167, 132], "hex": "#1ba784", "name": "竹绿", "pinyin": "zhulv" }, { - "CMYK": [ - 98, - 2, - 64, - 0 - ], - "RGB": [ - 18, - 161, - 130 - ], + "CMYK": [98, 2, 64, 0], + "RGB": [18, 161, 130], "hex": "#12a182", "name": "蓝绿", "pinyin": "lanlv" }, { - "CMYK": [ - 32, - 7, - 18, - 0 - ], - "RGB": [ - 196, - 215, - 214 - ], + "CMYK": [32, 7, 18, 0], + "RGB": [196, 215, 214], "hex": "#c4d7d6", "name": "穹灰", "pinyin": "qionghui" }, { - "CMYK": [ - 94, - 11, - 33, - 1 - ], - "RGB": [ - 30, - 158, - 179 - ], + "CMYK": [94, 11, 33, 1], + "RGB": [30, 158, 179], "hex": "#1e9eb3", "name": "翠蓝", "pinyin": "cuilan" }, { - "CMYK": [ - 96, - 16, - 31, - 3 - ], - "RGB": [ - 15, - 149, - 176 - ], + "CMYK": [96, 16, 31, 3], + "RGB": [15, 149, 176], "hex": "#0f95b0", "name": "胆矾蓝", "pinyin": "danfanlan" }, { - "CMYK": [ - 96, - 18, - 34, - 4 - ], - "RGB": [ - 20, - 145, - 168 - ], + "CMYK": [96, 18, 34, 4], + "RGB": [20, 145, 168], "hex": "#1491a8", "name": "樫鸟蓝", "pinyin": "jianniaolan" }, { - "CMYK": [ - 64, - 18, - 32, - 2 - ], - "RGB": [ - 124, - 171, - 177 - ], + "CMYK": [64, 18, 32, 2], + "RGB": [124, 171, 177], "hex": "#7cabb1", "name": "闪蓝", "pinyin": "shanlan" }, { - "CMYK": [ - 40, - 24, - 32, - 6 - ], - "RGB": [ - 164, - 172, - 167 - ], + "CMYK": [40, 24, 32, 6], + "RGB": [164, 172, 167], "hex": "#a4aca7", "name": "冰山蓝", "pinyin": "bingshanlan" }, { - "CMYK": [ - 56, - 26, - 36, - 7 - ], - "RGB": [ - 134, - 157, - 157 - ], + "CMYK": [56, 26, 36, 7], + "RGB": [134, 157, 157], "hex": "#869d9d", "name": "虾壳青", "pinyin": "xiakeqing" }, { - "CMYK": [ - 71, - 28, - 39, - 10 - ], - "RGB": [ - 100, - 142, - 147 - ], + "CMYK": [71, 28, 39, 10], + "RGB": [100, 142, 147], "hex": "#648e93", "name": "晚波蓝", "pinyin": "wanbolan" }, { - "CMYK": [ - 89, - 27, - 41, - 13 - ], - "RGB": [ - 59, - 129, - 140 - ], + "CMYK": [89, 27, 41, 13], + "RGB": [59, 129, 140], "hex": "#3b818c", "name": "蜻蜓蓝", "pinyin": "qingtinglan" }, { - "CMYK": [ - 99, - 33, - 38, - 21 - ], - "RGB": [ - 18, - 110, - 130 - ], + "CMYK": [99, 33, 38, 21], + "RGB": [18, 110, 130], "hex": "#126e82", "name": "玉鈫蓝", "pinyin": "yuqinlan" }, { - "CMYK": [ - 57, - 37, - 42, - 21 - ], - "RGB": [ - 115, - 124, - 123 - ], + "CMYK": [57, 37, 42, 21], + "RGB": [115, 124, 123], "hex": "#737c7b", "name": "垩灰", "pinyin": "ehui" }, { - "CMYK": [ - 65, - 40, - 44, - 26 - ], - "RGB": [ - 97, - 113, - 114 - ], + "CMYK": [65, 40, 44, 26], + "RGB": [97, 113, 114], "hex": "#617172", "name": "夏云灰", "pinyin": "xiayunhui" }, { - "CMYK": [ - 100, - 52, - 46, - 43 - ], - "RGB": [ - 19, - 72, - 87 - ], + "CMYK": [100, 52, 46, 43], + "RGB": [19, 72, 87], "hex": "#134857", "name": "苍蓝", "pinyin": "canglan" }, { - "CMYK": [ - 67, - 53, - 51, - 50 - ], - "RGB": [ - 71, - 75, - 76 - ], + "CMYK": [67, 53, 51, 50], + "RGB": [71, 75, 76], "hex": "#474b4c", "name": "黄昏灰", "pinyin": "huanghunhui" }, { - "CMYK": [ - 94, - 58, - 54, - 60 - ], - "RGB": [ - 33, - 55, - 61 - ], + "CMYK": [94, 58, 54, 60], + "RGB": [33, 55, 61], "hex": "#21373d", "name": "灰蓝", "pinyin": "huilan" }, { - "CMYK": [ - 100, - 64, - 56, - 68 - ], - "RGB": [ - 19, - 44, - 51 - ], + "CMYK": [100, 64, 56, 68], + "RGB": [19, 44, 51], "hex": "#132c33", "name": "深灰蓝", "pinyin": "shenhuilan" }, { - "CMYK": [ - 49, - 5, - 37, - 0 - ], - "RGB": [ - 164, - 202, - 182 - ], + "CMYK": [49, 5, 37, 0], + "RGB": [164, 202, 182], "hex": "#a4cab6", "name": "玉簪绿", "pinyin": "yuzanlv" }, { - "CMYK": [ - 96, - 12, - 66, - 2 - ], - "RGB": [ - 44, - 150, - 120 - ], + "CMYK": [96, 12, 66, 2], + "RGB": [44, 150, 120], "hex": "#2c9678", "name": "青矾绿", "pinyin": "qingfanlv" }, { - "CMYK": [ - 52, - 11, - 37, - 0 - ], - "RGB": [ - 154, - 190, - 175 - ], + "CMYK": [52, 11, 37, 0], + "RGB": [154, 190, 175], "hex": "#9abeaf", "name": "草原远绿", "pinyin": "caoyuanyuanlv" }, { - "CMYK": [ - 74, - 14, - 51, - 1 - ], - "RGB": [ - 105, - 167, - 148 - ], + "CMYK": [74, 14, 51, 1], + "RGB": [105, 167, 148], "hex": "#69a794", "name": "梧枝绿", "pinyin": "wuzhilv" }, { - "CMYK": [ - 55, - 16, - 40, - 1 - ], - "RGB": [ - 146, - 179, - 165 - ], + "CMYK": [55, 16, 40, 1], + "RGB": [146, 179, 165], "hex": "#92b3a5", "name": "浪花绿", "pinyin": "langhualv" }, { - "CMYK": [ - 99, - 23, - 70, - 10 - ], - "RGB": [ - 36, - 128, - 103 - ], + "CMYK": [99, 23, 70, 10], + "RGB": [36, 128, 103], "hex": "#248067", "name": "海王绿", "pinyin": "haiwanglv" }, { - "CMYK": [ - 88, - 24, - 61, - 9 - ], - "RGB": [ - 66, - 134, - 117 - ], + "CMYK": [88, 24, 61, 9], + "RGB": [66, 134, 117], "hex": "#428675", "name": "亚丁绿", "pinyin": "yadinglv" }, { - "CMYK": [ - 40, - 27, - 36, - 8 - ], - "RGB": [ - 159, - 163, - 154 - ], + "CMYK": [40, 27, 36, 8], + "RGB": [159, 163, 154], "hex": "#9fa39a", "name": "镍灰", "pinyin": "niehui" }, { - "CMYK": [ - 52, - 28, - 42, - 10 - ], - "RGB": [ - 138, - 152, - 142 - ], + "CMYK": [52, 28, 42, 10], + "RGB": [138, 152, 142], "hex": "#8a988e", "name": "明灰", "pinyin": "minghui" }, { - "CMYK": [ - 63, - 31, - 50, - 14 - ], - "RGB": [ - 112, - 136, - 125 - ], + "CMYK": [63, 31, 50, 14], + "RGB": [112, 136, 125], "hex": "#70887d", "name": "淡绿灰", "pinyin": "danlvhui" }, { - "CMYK": [ - 82, - 32, - 60, - 20 - ], - "RGB": [ - 73, - 117, - 104 - ], + "CMYK": [82, 32, 60, 20], + "RGB": [73, 117, 104], "hex": "#497568", "name": "飞泉绿", "pinyin": "feiquanlv" }, { - "CMYK": [ - 62, - 43, - 52, - 34 - ], - "RGB": [ - 93, - 101, - 95 - ], + "CMYK": [62, 43, 52, 34], + "RGB": [93, 101, 95], "hex": "#5d655f", "name": "狼烟灰", "pinyin": "langyanhui" }, { - "CMYK": [ - 85, - 44, - 64, - 52 - ], - "RGB": [ - 49, - 74, - 67 - ], + "CMYK": [85, 44, 64, 52], + "RGB": [49, 74, 67], "hex": "#314a43", "name": "绿灰", "pinyin": "lvhui" }, { - "CMYK": [ - 93, - 46, - 70, - 61 - ], - "RGB": [ - 34, - 62, - 54 - ], + "CMYK": [93, 46, 70, 61], + "RGB": [34, 62, 54], "hex": "#223e36", "name": "苍绿", "pinyin": "canglv" }, { - "CMYK": [ - 98, - 46, - 73, - 63 - ], - "RGB": [ - 26, - 59, - 50 - ], + "CMYK": [98, 46, 73, 63], + "RGB": [26, 59, 50], "hex": "#1a3b32", "name": "深海绿", "pinyin": "shenhailv" }, { - "CMYK": [ - 67, - 60, - 57, - 68 - ], - "RGB": [ - 54, - 52, - 51 - ], + "CMYK": [67, 60, 57, 68], + "RGB": [54, 52, 51], "hex": "#363433", "name": "长石灰", "pinyin": "changshihui" }, { - "CMYK": [ - 82, - 60, - 65, - 80 - ], - "RGB": [ - 31, - 38, - 35 - ], + "CMYK": [82, 60, 65, 80], + "RGB": [31, 38, 35], "hex": "#1f2623", "name": "苷蓝绿", "pinyin": "ganlanlv" }, { - "CMYK": [ - 90, - 62, - 67, - 86 - ], - "RGB": [ - 20, - 30, - 27 - ], + "CMYK": [90, 62, 67, 86], + "RGB": [20, 30, 27], "hex": "#141e1b", "name": "莽丛绿", "pinyin": "mangconglv" }, { - "CMYK": [ - 33, - 1, - 29, - 0 - ], - "RGB": [ - 198, - 223, - 200 - ], + "CMYK": [33, 1, 29, 0], + "RGB": [198, 223, 200], "hex": "#c6dfc8", "name": "淡翠绿", "pinyin": "dancuilv" }, { - "CMYK": [ - 53, - 1, - 44, - 0 - ], - "RGB": [ - 158, - 204, - 171 - ], + "CMYK": [53, 1, 44, 0], + "RGB": [158, 204, 171], "hex": "#9eccab", "name": "明绿", "pinyin": "minglv" }, { - "CMYK": [ - 75, - 0, - 59, - 0 - ], - "RGB": [ - 104, - 184, - 142 - ], + "CMYK": [75, 0, 59, 0], + "RGB": [104, 184, 142], "hex": "#68b88e", "name": "田园绿", "pinyin": "tianyuanlv" }, { - "CMYK": [ - 98, - 0, - 82, - 0 - ], - "RGB": [ - 32, - 161, - 98 - ], + "CMYK": [98, 0, 82, 0], + "RGB": [32, 161, 98], "hex": "#20a162", "name": "翠绿", "pinyin": "cuilv" }, { - "CMYK": [ - 78, - 6, - 62, - 0 - ], - "RGB": [ - 97, - 172, - 133 - ], + "CMYK": [78, 6, 62, 0], + "RGB": [97, 172, 133], "hex": "#61ac85", "name": "淡绿", "pinyin": "danlv" }, { - "CMYK": [ - 90, - 7, - 73, - 0 - ], - "RGB": [ - 64, - 160, - 112 - ], + "CMYK": [90, 7, 73, 0], + "RGB": [64, 160, 112], "hex": "#40a070", "name": "葱绿", "pinyin": "conglv" }, { - "CMYK": [ - 99, - 10, - 91, - 2 - ], - "RGB": [ - 34, - 148, - 83 - ], + "CMYK": [99, 10, 91, 2], + "RGB": [34, 148, 83], "hex": "#229453", "name": "孔雀绿", "pinyin": "kongquelv" }, { - "CMYK": [ - 27, - 11, - 27, - 1 - ], - "RGB": [ - 202, - 211, - 195 - ], + "CMYK": [27, 11, 27, 1], + "RGB": [202, 211, 195], "hex": "#cad3c3", "name": "艾绿", "pinyin": "ailv" }, { - "CMYK": [ - 92, - 14, - 76, - 2 - ], - "RGB": [ - 60, - 149, - 102 - ], + "CMYK": [92, 14, 76, 2], + "RGB": [60, 149, 102], "hex": "#3c9566", "name": "蟾绿", "pinyin": "chanlv" }, { - "CMYK": [ - 100, - 17, - 92, - 5 - ], - "RGB": [ - 32, - 137, - 77 - ], + "CMYK": [100, 17, 92, 5], + "RGB": [32, 137, 77], "hex": "#20894d", "name": "宫殿绿", "pinyin": "gongdianlv" }, { - "CMYK": [ - 61, - 19, - 52, - 3 - ], - "RGB": [ - 131, - 167, - 141 - ], + "CMYK": [61, 19, 52, 3], + "RGB": [131, 167, 141], "hex": "#83a78d", "name": "松霜绿", "pinyin": "songshuanglv" }, { - "CMYK": [ - 81, - 19, - 67, - 4 - ], - "RGB": [ - 87, - 149, - 114 - ], + "CMYK": [81, 19, 67, 4], + "RGB": [87, 149, 114], "hex": "#579572", "name": "蛋白石绿", "pinyin": "danbaishilv" }, { - "CMYK": [ - 100, - 22, - 90, - 10 - ], - "RGB": [ - 32, - 127, - 76 - ], + "CMYK": [100, 22, 90, 10], + "RGB": [32, 127, 76], "hex": "#207f4c", "name": "薄荷绿", "pinyin": "bohelv" }, { - "CMYK": [ - 66, - 29, - 58, - 12 - ], - "RGB": [ - 110, - 139, - 116 - ], + "CMYK": [66, 29, 58, 12], + "RGB": [110, 139, 116], "hex": "#6e8b74", "name": "瓦松绿", "pinyin": "wasonglv" }, { - "CMYK": [ - 100, - 31, - 91, - 25 - ], - "RGB": [ - 26, - 104, - 64 - ], + "CMYK": [100, 31, 91, 25], + "RGB": [26, 104, 64], "hex": "#1a6840", "name": "荷叶绿", "pinyin": "heyelv" }, { - "CMYK": [ - 62, - 42, - 56, - 34 - ], - "RGB": [ - 94, - 102, - 91 - ], + "CMYK": [62, 42, 56, 34], + "RGB": [94, 102, 91], "hex": "#5e665b", "name": "田螺绿", "pinyin": "tianluolv" }, { - "CMYK": [ - 74, - 42, - 65, - 40 - ], - "RGB": [ - 72, - 91, - 77 - ], + "CMYK": [74, 42, 65, 40], + "RGB": [72, 91, 77], "hex": "#485b4d", "name": "白屈菜绿", "pinyin": "baiqucailv" }, { - "CMYK": [ - 64, - 57, - 60, - 67 - ], - "RGB": [ - 57, - 55, - 51 - ], + "CMYK": [64, 57, 60, 67], + "RGB": [57, 55, 51], "hex": "#393733", "name": "河豚灰", "pinyin": "hetunhui" }, { - "CMYK": [ - 68, - 56, - 60, - 66 - ], - "RGB": [ - 55, - 56, - 52 - ], + "CMYK": [68, 56, 60, 66], + "RGB": [55, 56, 52], "hex": "#373834", "name": "蒽油绿", "pinyin": "enyoulv" }, { - "CMYK": [ - 76, - 56, - 75, - 72 - ], - "RGB": [ - 43, - 49, - 44 - ], + "CMYK": [76, 56, 75, 72], + "RGB": [43, 49, 44], "hex": "#2b312c", "name": "槲寄生绿", "pinyin": "hujishenglv" }, { - "CMYK": [ - 91, - 60, - 76, - 83 - ], - "RGB": [ - 21, - 35, - 27 - ], + "CMYK": [91, 60, 76, 83], + "RGB": [21, 35, 27], "hex": "#15231b", "name": "云杉绿", "pinyin": "yunshanlv" }, { - "CMYK": [ - 9, - 1, - 14, - 0 - ], - "RGB": [ - 240, - 245, - 229 - ], + "CMYK": [9, 1, 14, 0], + "RGB": [240, 245, 229], "hex": "#f0f5e5", "name": "嫩菊绿", "pinyin": "nenjulv" }, { - "CMYK": [ - 20, - 1, - 23, - 0 - ], - "RGB": [ - 223, - 236, - 213 - ], + "CMYK": [20, 1, 23, 0], + "RGB": [223, 236, 213], "hex": "#dfecd5", "name": "艾背绿", "pinyin": "aibeilv" }, { - "CMYK": [ - 47, - 0, - 49, - 0 - ], - "RGB": [ - 173, - 213, - 162 - ], + "CMYK": [47, 0, 49, 0], + "RGB": [173, 213, 162], "hex": "#add5a2", "name": "嘉陵水绿", "pinyin": "jialingshuilv" }, { - "CMYK": [ - 89, - 0, - 96, - 0 - ], - "RGB": [ - 65, - 179, - 73 - ], + "CMYK": [89, 0, 96, 0], + "RGB": [65, 179, 73], "hex": "#41b349", "name": "玉髓绿", "pinyin": "yusuilv" }, { - "CMYK": [ - 88, - 0, - 99, - 0 - ], - "RGB": [ - 67, - 178, - 68 - ], + "CMYK": [88, 0, 99, 0], + "RGB": [67, 178, 68], "hex": "#43b244", "name": "鲜绿", "pinyin": "xianlv" }, { - "CMYK": [ - 90, - 0, - 100, - 0 - ], - "RGB": [ - 65, - 174, - 60 - ], + "CMYK": [90, 0, 100, 0], + "RGB": [65, 174, 60], "hex": "#41ae3c", "name": "宝石绿", "pinyin": "baoshilv" }, { - "CMYK": [ - 18, - 4, - 33, - 0 - ], - "RGB": [ - 226, - 231, - 191 - ], + "CMYK": [18, 4, 33, 0], + "RGB": [226, 231, 191], "hex": "#e2e7bf", "name": "海沬绿", "pinyin": "haimeilv" }, { - "CMYK": [ - 28, - 4, - 44, - 0 - ], - "RGB": [ - 208, - 222, - 170 - ], + "CMYK": [28, 4, 44, 0], + "RGB": [208, 222, 170], "hex": "#d0deaa", "name": "姚黄", "pinyin": "yaohuang" }, { - "CMYK": [ - 44, - 3, - 61, - 0 - ], - "RGB": [ - 178, - 207, - 135 - ], + "CMYK": [44, 3, 61, 0], + "RGB": [178, 207, 135], "hex": "#b2cf87", "name": "橄榄石绿", "pinyin": "ganlanshilv" }, { - "CMYK": [ - 62, - 0, - 76, - 0 - ], - "RGB": [ - 140, - 194, - 105 - ], + "CMYK": [62, 0, 76, 0], + "RGB": [140, 194, 105], "hex": "#8cc269", "name": "水绿", "pinyin": "shuilv" }, { - "CMYK": [ - 42, - 3, - 67, - 0 - ], - "RGB": [ - 183, - 208, - 122 - ], + "CMYK": [42, 3, 67, 0], + "RGB": [183, 208, 122], "hex": "#b7d07a", "name": "芦苇绿", "pinyin": "luweilv" }, { - "CMYK": [ - 28, - 6, - 66, - 0 - ], - "RGB": [ - 210, - 217, - 122 - ], + "CMYK": [28, 6, 66, 0], + "RGB": [210, 217, 122], "hex": "#d2d97a", "name": "槐花黄绿", "pinyin": "huaihuahuanglv" }, { - "CMYK": [ - 41, - 4, - 76, - 0 - ], - "RGB": [ - 186, - 207, - 101 - ], + "CMYK": [41, 4, 76, 0], + "RGB": [186, 207, 101], "hex": "#bacf65", "name": "苹果绿", "pinyin": "pingguolv" }, { - "CMYK": [ - 58, - 1, - 88, - 0 - ], - "RGB": [ - 150, - 194, - 78 - ], + "CMYK": [58, 1, 88, 0], + "RGB": [150, 194, 78], "hex": "#96c24e", "name": "芽绿", "pinyin": "yalv" }, { - "CMYK": [ - 19, - 9, - 84, - 1 - ], - "RGB": [ - 226, - 216, - 73 - ], + "CMYK": [19, 9, 84, 1], + "RGB": [226, 216, 73], "hex": "#e2d849", "name": "蝶黄", "pinyin": "diehuang" }, { - "CMYK": [ - 38, - 8, - 94, - 1 - ], - "RGB": [ - 190, - 201, - 54 - ], + "CMYK": [38, 8, 94, 1], + "RGB": [190, 201, 54], "hex": "#bec936", "name": "橄榄黄绿", "pinyin": "ganlanhuanglv" }, { - "CMYK": [ - 81, - 0, - 100, - 0 - ], - "RGB": [ - 91, - 174, - 35 - ], + "CMYK": [81, 0, 100, 0], + "RGB": [91, 174, 35], "hex": "#5bae23", "name": "鹦鹉绿", "pinyin": "yingwulv" }, { - "CMYK": [ - 84, - 64, - 94, - 45 - ], - "RGB": [ - 37, - 61, - 36 - ], + "CMYK": [84, 64, 94, 45], + "RGB": [37, 61, 36], "hex": "#253d24", "name": "油绿", "pinyin": "youlv" }, { - "CMYK": [ - 0, - 1, - 4, - 0 - ], - "RGB": [ - 255, - 254, - 248 - ], + "CMYK": [0, 1, 4, 0], + "RGB": [255, 254, 248], "hex": "#fffef8", "name": "象牙白", "pinyin": "xiangyabai" }, { - "CMYK": [ - 3, - 5, - 8, - 0 - ], - "RGB": [ - 248, - 244, - 237 - ], + "CMYK": [3, 5, 8, 0], + "RGB": [248, 244, 237], "hex": "#f8f4ed", "name": "汉白玉", "pinyin": "hanbaiyu" }, { - "CMYK": [ - 0, - 1, - 3, - 0 - ], - "RGB": [ - 255, - 254, - 249 - ], + "CMYK": [0, 1, 3, 0], + "RGB": [255, 254, 249], "hex": "#fffef9", "name": "雪白", "pinyin": "xuebai" }, { - "CMYK": [ - 4, - 4, - 8, - 0 - ], - "RGB": [ - 247, - 244, - 237 - ], + "CMYK": [4, 4, 8, 0], + "RGB": [247, 244, 237], "hex": "#f7f4ed", "name": "鱼肚白", "pinyin": "yudubai" }, { - "CMYK": [ - 12, - 12, - 16, - 0 - ], - "RGB": [ - 228, - 223, - 215 - ], + "CMYK": [12, 12, 16, 0], + "RGB": [228, 223, 215], "hex": "#e4dfd7", "name": "珍珠灰", "pinyin": "zhenzhuhui" }, { - "CMYK": [ - 16, - 15, - 20, - 1 - ], - "RGB": [ - 218, - 212, - 203 - ], + "CMYK": [16, 15, 20, 1], + "RGB": [218, 212, 203], "hex": "#dad4cb", "name": "浅灰", "pinyin": "qianhui" }, { - "CMYK": [ - 28, - 5, - 30, - 5 - ], - "RGB": [ - 187, - 181, - 172 - ], + "CMYK": [28, 5, 30, 5], + "RGB": [187, 181, 172], "hex": "#bbb5ac", "name": "铅灰", "pinyin": "qianhui" }, { - "CMYK": [ - 28, - 25, - 30, - 5 - ], - "RGB": [ - 187, - 181, - 172 - ], + "CMYK": [28, 25, 30, 5], + "RGB": [187, 181, 172], "hex": "#bbb5ac", "name": "中灰", "pinyin": "zhonghui" }, { - "CMYK": [ - 42, - 40, - 43, - 23 - ], - "RGB": [ - 134, - 126, - 118 - ], + "CMYK": [42, 40, 43, 23], + "RGB": [134, 126, 118], "hex": "#867e76", "name": "瓦灰", "pinyin": "wahui" }, { - "CMYK": [ - 43, - 40, - 44, - 42 - ], - "RGB": [ - 132, - 124, - 116 - ], + "CMYK": [43, 40, 44, 42], + "RGB": [132, 124, 116], "hex": "#847c74", "name": "夜灰", "pinyin": "yehui" }, { - "CMYK": [ - 42, - 42, - 45, - 27 - ], - "RGB": [ - 128, - 118, - 110 - ], + "CMYK": [42, 42, 45, 27], + "RGB": [128, 118, 110], "hex": "#80766e", "name": "雁灰", "pinyin": "yanhui" }, { - "CMYK": [ - 42, - 42, - 46, - 27 - ], - "RGB": [ - 129, - 119, - 110 - ], + "CMYK": [42, 42, 46, 27], + "RGB": [129, 119, 110], "hex": "#81776e", "name": "深灰", "pinyin": "shenhui" } -] \ No newline at end of file +] diff --git a/src/settings/designColorRecommend.json b/src/settings/designColorRecommend.json index 75df5407..79420979 100644 --- a/src/settings/designColorRecommend.json +++ b/src/settings/designColorRecommend.json @@ -1,66 +1,30 @@ [ { - "CMYK": [ - 62, - 0, - 21, - 16 - ], - "RGB": [ - 81, - 214, - 169 - ], + "CMYK": [62, 0, 21, 16], + "RGB": [81, 214, 169], "hex": "#51d6a9", "name": "碧空绿", "pinyin": "bikonlv" }, { - "CMYK": [ - 93, - 0, - 31, - 0 - ], - "RGB": [ - 16, - 174, - 194 - ], - "hex": "#10aec2", - "name": "甸子蓝", - "pinyin": "dianzilan" + "CMYK": [4, 13, 67, 0], + "RGB": [248, 223, 114], + "hex": "#f8df72", + "name": "茉莉黄", + "pinyin": "molihuang" }, { - "CMYK": [ - 76, - 51, - 0, - 0 - ], - "RGB": [ - 60, - 126, - 255 - ], + "CMYK": [76, 51, 0, 0], + "RGB": [60, 126, 255], "hex": "#3c7eff", "name": "深海蓝", "pinyin": "shenhailan" }, { - "CMYK": [ - 4, - 13, - 67, - 0 - ], - "RGB": [ - 248, - 223, - 114 - ], - "hex": "#f8df72", - "name": "茉莉黄", - "pinyin": "molihuang" + "CMYK": [59, 12, 19, 0], + "RGB": [138, 188, 209], + "hex": "#8abcd1", + "name": "秋波蓝", + "pinyin": "qiubolan" } -] \ No newline at end of file +] From 9707e4af0faa38e3eac47d4150a87065c5ae1d8d 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: Sat, 1 Oct 2022 21:10:06 +0800 Subject: [PATCH 39/56] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E5=B1=95=E7=A4=BA=E7=B1=BB=E5=9E=8B=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/index.d.ts | 11 +++++--- .../chartLayoutStore/chartLayoutStore.d.ts | 8 ++++++ .../chartLayoutStore/chartLayoutStore.ts | 9 +++++-- .../components/LayersGroupListItem/index.vue | 2 +- .../components/LayersListItem/index.vue | 2 +- .../components/LayersStatus/index.vue | 5 ++-- src/views/chart/ContentLayers/index.d.ts | 4 --- src/views/chart/ContentLayers/index.vue | 26 ++++++++++++------- 8 files changed, 43 insertions(+), 24 deletions(-) delete mode 100644 src/views/chart/ContentLayers/index.d.ts diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts index e7d8cdf4..a565b12b 100644 --- a/src/packages/index.d.ts +++ b/src/packages/index.d.ts @@ -36,6 +36,12 @@ interface EchartsDataType { source: any[] } +// 组件状态 +export interface StatusType { + lock: boolean, + hide: boolean, +} + // 滤镜/变换枚举 export enum FilterEnum { // 是否启用 @@ -84,11 +90,8 @@ export interface PublicConfigType { // 动画 animations: string[] }, - status: { - lock: boolean, - hide: boolean, - }, filter?: string + status: StatusType, setPosition: Function } diff --git a/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts b/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts index fecae02b..135f155a 100644 --- a/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts +++ b/src/store/modules/chartLayoutStore/chartLayoutStore.d.ts @@ -1,7 +1,13 @@ +export enum LayerModeEnum { + THUMBNAIL = 'thumbnail', + TEXT = 'text' +} + export enum ChartLayoutStoreEnum { LAYERS = 'layers', CHARTS = 'charts', DETAILS = 'details', + LAYER_TYPE = 'layerType' } export interface ChartLayoutType { @@ -11,4 +17,6 @@ export interface ChartLayoutType { [ChartLayoutStoreEnum.CHARTS]: boolean // 详情设置 [ChartLayoutStoreEnum.DETAILS]: boolean + // 层级展示方式 + [ChartLayoutStoreEnum.LAYER_TYPE]: LayerModeEnum } diff --git a/src/store/modules/chartLayoutStore/chartLayoutStore.ts b/src/store/modules/chartLayoutStore/chartLayoutStore.ts index e2c4ac9b..6a8bcc1a 100644 --- a/src/store/modules/chartLayoutStore/chartLayoutStore.ts +++ b/src/store/modules/chartLayoutStore/chartLayoutStore.ts @@ -1,5 +1,5 @@ import { defineStore } from 'pinia' -import { ChartLayoutType } from './chartLayoutStore.d' +import { ChartLayoutType, LayerModeEnum } from './chartLayoutStore.d' import { setLocalStorage, getLocalStorage } from '@/utils' import { StorageEnum } from '@/enums/storageEnum' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' @@ -20,7 +20,9 @@ export const useChartLayoutStore = defineStore({ // 图表组件 charts: true, // 详情设置(收缩为true) - details: false + details: false, + // 图层类型(默认图片) + layerType: LayerModeEnum.THUMBNAIL }, getters: { getLayers(): boolean { @@ -31,6 +33,9 @@ export const useChartLayoutStore = defineStore({ }, getDetails(): boolean { return this.details + }, + getLayerType(): LayerModeEnum { + return this.layerType } }, actions: { diff --git a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue index d9156753..587eb85b 100644 --- a/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersGroupListItem/index.vue @@ -51,10 +51,10 @@ import { useDesignStore } from '@/store/modules/designStore/designStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' +import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { LayersListItem } from '../LayersListItem' import { LayersStatus } from '../LayersStatus/index' -import { LayerModeEnum } from '../../index.d' import { icon } from '@/plugins' const props = defineProps({ diff --git a/src/views/chart/ContentLayers/components/LayersListItem/index.vue b/src/views/chart/ContentLayers/components/LayersListItem/index.vue index 8562b55f..2e72cff0 100644 --- a/src/views/chart/ContentLayers/components/LayersListItem/index.vue +++ b/src/views/chart/ContentLayers/components/LayersListItem/index.vue @@ -24,8 +24,8 @@ import { computed, PropType } from 'vue' import { requireErrorImg } from '@/utils' import { useDesignStore } from '@/store/modules/designStore/designStore' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { LayersStatus } from '../LayersStatus/index' -import { LayerModeEnum } from '../../index.d' const props = defineProps({ componentData: { diff --git a/src/views/chart/ContentLayers/components/LayersStatus/index.vue b/src/views/chart/ContentLayers/components/LayersStatus/index.vue index e0cc2547..a43d8aa0 100644 --- a/src/views/chart/ContentLayers/components/LayersStatus/index.vue +++ b/src/views/chart/ContentLayers/components/LayersStatus/index.vue @@ -20,9 +20,8 @@ <script setup lang="ts"> import { computed, PropType } from 'vue' import { useDesignStore } from '@/store/modules/designStore/designStore' -import { PublicConfigType } from '@/packages/index.d' +import { StatusType } from '@/packages/index.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' -import { LayerModeEnum } from '../../index.d' import { icon } from '@/plugins' const props = defineProps({ @@ -35,7 +34,7 @@ const props = defineProps({ default: false }, status: { - type: Object as PropType<Pick<PublicConfigType, 'status'>>, + type: Object as PropType<StatusType>, default: () => ({ lock: false, hide: false diff --git a/src/views/chart/ContentLayers/index.d.ts b/src/views/chart/ContentLayers/index.d.ts deleted file mode 100644 index 06596dee..00000000 --- a/src/views/chart/ContentLayers/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum LayerModeEnum { - THUMBNAIL = 'thumbnail', - TEXT = 'text' -} diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index c3323410..d1a89269 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -14,12 +14,12 @@ <template #top-right> <n-button-group style="display: flex"> <n-button - v-for="(item, index) in layerModeEnumList" + v-for="(item, index) in layerModeList" :key="index" ghost size="small" :type="layerMode === item.value ? 'primary' : 'tertiary'" - @click="layerMode = item.value as LayerModeEnum" + @click="changeLayerType(item.value)" > <n-tooltip :show-arrow="false" trigger="hover"> <template #trigger> @@ -68,7 +68,7 @@ import Draggable from 'vuedraggable' import cloneDeep from 'lodash/cloneDeep' import { ContentBox } from '../ContentBox/index' import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore' -import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' +import { ChartLayoutStoreEnum, LayerModeEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' @@ -77,7 +77,6 @@ import { MenuEnum, MouseEventButton, WinKeyboard, MacKeyboard } from '@/enums/ed import { LayersListItem } from './components/LayersListItem/index' import { LayersGroupListItem } from './components/LayersGroupListItem/index' -import { LayerModeEnum } from './index.d' import { icon } from '@/plugins' @@ -86,12 +85,13 @@ const chartLayoutStore = useChartLayoutStore() const chartEditStore = useChartEditStore() const { handleContextMenu, onClickOutSide } = useContextMenu() -const layerList = ref<any>([]) -const layerModeEnumList = [ - { label: '缩略图', icon: ImagesIcon, value: 'thumbnail' }, - { label: '文本列表', icon: ListIcon, value: 'text' } +const layerModeList = [ + { label: '缩略图', icon: ImagesIcon, value: LayerModeEnum.THUMBNAIL }, + { label: '文本列表', icon: ListIcon, value: LayerModeEnum.TEXT } ] -const layerMode = ref<LayerModeEnum>('thumbnail') + +const layerList = ref<any>([]) +const layerMode = ref<LayerModeEnum>(chartLayoutStore.getLayerType) // 逆序展示 const reverseList = computed(() => { @@ -117,6 +117,7 @@ const optionsHandle = ( return targetList.filter(i => i.key === MenuEnum.GROUP) } const statusMenuEnums: MenuEnum[] = [] + // 处理锁定与隐藏 if (targetInstance.status.lock) { statusMenuEnums.push(MenuEnum.LOCK) } else { @@ -191,6 +192,13 @@ const mouseenterHandle = (item: CreateComponentType) => { const mouseleaveHandle = (item: CreateComponentType) => { chartEditStore.setTargetHoverChart(undefined) } + +// 修改图层展示方式 +const changeLayerType = (value: LayerModeEnum) => { + layerMode.value = value + chartLayoutStore.setItem(ChartLayoutStoreEnum.LAYER_TYPE, value) +} + </script> <style lang="scss" scoped> From 4c290d64ba8f783d988c0ae76baaed7adfa0a522 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 1 Oct 2022 22:49:27 +0800 Subject: [PATCH 40/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20naive-ui=20?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E7=89=88=E6=9C=AC=E9=80=A0=E6=88=90=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 440 +++++++++++++++++++++++++------------------------ 2 files changed, 228 insertions(+), 214 deletions(-) diff --git a/package.json b/package.json index 41d285bc..a9af7246 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "html2canvas": "^1.4.1", "keymaster": "^1.6.2", "monaco-editor": "^0.33.0", - "naive-ui": "2.30.3", + "naive-ui": "2.33.3", "pinia": "^2.0.13", "screenfull": "^6.0.1", "vue": "^3.2.31", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0eb5f28..07381313 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ specifiers: lodash: ~4.17.21 mockjs: ^1.1.0 monaco-editor: ^0.33.0 - naive-ui: 2.30.3 + naive-ui: 2.33.3 pinia: ^2.0.13 plop: ^3.0.5 prettier: ^2.6.2 @@ -77,7 +77,7 @@ dependencies: html2canvas: 1.4.1 keymaster: 1.6.2 monaco-editor: 0.33.0 - naive-ui: 2.30.3_vue@3.2.37 + naive-ui: registry.npmmirror.com/naive-ui/2.33.3_vue@3.2.37 pinia: 2.0.14_ub5l46u3nefphax5x2tezui4oq screenfull: 6.0.1 vue: 3.2.37 @@ -458,7 +458,7 @@ packages: engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.0.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 dev: true /@commitlint/execute-rule/17.0.0: @@ -500,11 +500,11 @@ packages: '@commitlint/execute-rule': 17.0.0 '@commitlint/resolve-extends': 17.0.0 '@commitlint/types': 17.0.0 - '@types/node': 17.0.43 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 chalk: 4.1.2 cosmiconfig: 7.0.1 cosmiconfig-typescript-loader: 2.0.1_sg2ukyc6p547g74ru6fclbyzsu - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 resolve-from: 5.0.0 typescript: 4.7.3 transitivePeerDependencies: @@ -543,7 +543,7 @@ packages: '@commitlint/config-validator': 17.0.0 '@commitlint/types': 17.0.0 import-fresh: 3.3.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true @@ -585,22 +585,6 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@css-render/plugin-bem/0.15.10_css-render@0.15.10: - resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==} - peerDependencies: - css-render: ~0.15.10 - dependencies: - css-render: 0.15.10 - dev: false - - /@css-render/vue3-ssr/0.15.10_vue@3.2.37: - resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==} - peerDependencies: - vue: ^3.0.11 - dependencies: - vue: 3.2.37 - dev: false - /@emmetio/abbreviation/2.2.3: resolution: {integrity: sha512-87pltuCPt99aL+y9xS6GPZ+Wmmyhll2WXH73gG/xpGcQ84DRnptBsI2r0BeIQ0EB/SQTOe2ANPqFqj3Rj5FOGA==} dependencies: @@ -617,10 +601,6 @@ packages: resolution: {integrity: sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA==} dev: true - /@emotion/hash/0.8.0: - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} - dev: false - /@eslint/eslintrc/1.3.0: resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -754,10 +734,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.13 dev: true - /@juggle/resize-observer/3.3.1: - resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==} - dev: false - /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -863,13 +839,6 @@ packages: rxjs: 7.5.5 dev: true - /@types/jest/27.5.2: - resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} - dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 - dev: false - /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true @@ -886,15 +855,9 @@ packages: resolution: {integrity: sha512-Ny/PJkO6nxWAQnaet8q/oWz15lrfwvdvBpuY4treB0CSsBO1CG0fVuNLngR3m3bepQLd+E4c3Y3DlC2okpUvPw==} dependencies: '@types/fined': 1.1.3 - '@types/node': 16.11.40 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 dev: true - /@types/lodash-es/4.17.6: - resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==} - dependencies: - '@types/lodash': 4.14.185 - dev: false - /@types/lodash/4.14.185: resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==} dev: false @@ -911,9 +874,6 @@ packages: resolution: {integrity: sha512-7bOWglXUO6f21NG3YDI7hIpeMX3M59GG+DzZuzX2EkFKYUnRoxq3EOg4R0KNv2hxryY9M3UUqG5akwwsifrukw==} dev: true - /@types/node/17.0.43: - resolution: {integrity: sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==} - /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: true @@ -925,13 +885,13 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 17.0.43 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 dev: true /@types/through/0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 17.0.43 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 dev: true /@typescript-eslint/eslint-plugin/5.28.0_evi7yu7wunhzwb24olrfvzynny: @@ -1223,7 +1183,7 @@ packages: dependencies: '@vue/runtime-core': 3.2.37 '@vue/shared': 3.2.37 - csstype: 2.6.20 + csstype: registry.npmmirror.com/csstype/2.6.20 /@vue/server-renderer/3.2.37_vue@3.2.37: resolution: {integrity: sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==} @@ -1332,6 +1292,7 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + dev: true /ansi-regex/6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} @@ -1350,11 +1311,7 @@ packages: engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false + dev: true /anymatch/3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} @@ -1425,10 +1382,6 @@ packages: resolution: {integrity: sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==} dev: true - /async-validator/4.1.1: - resolution: {integrity: sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==} - dev: false - /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -1603,6 +1556,7 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true /chalk/5.0.1: resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} @@ -1802,7 +1756,7 @@ packages: engines: {node: '>=10'} dependencies: compare-func: 2.0.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 q: 1.5.1 dev: true @@ -1813,7 +1767,7 @@ packages: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 @@ -1832,7 +1786,7 @@ packages: '@types/node': '*' typescript: '>=3' dependencies: - '@types/node': 17.0.43 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 cosmiconfig: 7.0.1 ts-node: 10.8.1_sg2ukyc6p547g74ru6fclbyzsu typescript: 4.7.3 @@ -1875,45 +1829,17 @@ packages: utrie: 1.0.2 dev: false - /css-render/0.15.10: - resolution: {integrity: sha512-6j5acvm81sXTHJiF47FNNICtDpF74YoWk1xEK3qQvdqgW6vc+OXrPqflL6m8f5GE6XuFYrbACNEd17kraCSBAQ==} - dependencies: - '@emotion/hash': 0.8.0 - '@types/node': 17.0.43 - csstype: 3.0.11 - dev: false - /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true dev: true - /csstype/2.6.20: - resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} - - /csstype/3.0.11: - resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} - dev: false - /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} dev: true - /date-fns-tz/1.3.4_date-fns@2.28.0: - resolution: {integrity: sha512-O47vEyz85F2ax/ZdhMBJo187RivZGjH6V0cPjPzpm/yi6YffJg4upD/8ibezO11ezZwP3QYlBHh/t4JhRNx0Ow==} - peerDependencies: - date-fns: '>=2.0.0' - dependencies: - date-fns: 2.28.0 - dev: false - - /date-fns/2.28.0: - resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==} - engines: {node: '>=0.11'} - dev: false - /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -2012,11 +1938,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /diff-sequences/27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -2476,10 +2397,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /evtd/0.2.3: - resolution: {integrity: sha512-tmiT1YUVqFjTY+BSBOAskL83xNx41iUfpvKP6Gcd/xMHjg3mnER98jXGXJyKnxCG19uPc6EhZiUC+MUyvoqCtw==} - dev: false - /execa/5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2748,7 +2665,7 @@ packages: hasBin: true dependencies: dargs: 7.0.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 @@ -2875,6 +2792,7 @@ packages: /has-flag/4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + dev: true /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} @@ -3031,7 +2949,7 @@ packages: cli-width: 3.0.0 external-editor: 3.1.0 figures: 3.2.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 @@ -3291,31 +3209,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /jest-diff/27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: false - - /jest-get-type/27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: false - - /jest-matcher-utils/27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: false - /js-stringify/1.0.2: resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} dev: true @@ -3452,10 +3345,6 @@ packages: p-locate: 5.0.0 dev: true - /lodash-es/4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false - /lodash.get/4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true @@ -3466,6 +3355,7 @@ packages: /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /log-symbols/4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -3634,31 +3524,6 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true - /naive-ui/2.30.3_vue@3.2.37: - resolution: {integrity: sha512-s6iphodOfLklhgAGtzhzoE0oPi6eY72UufUDRySBbfV+r+64vw9omYUOqk3Z1M/t/Mh8KwqW6z+ex8bYftFKPA==} - peerDependencies: - vue: ^3.0.0 - dependencies: - '@css-render/plugin-bem': 0.15.10_css-render@0.15.10 - '@css-render/vue3-ssr': 0.15.10_vue@3.2.37 - '@types/lodash': 4.14.185 - '@types/lodash-es': 4.17.6 - async-validator: 4.1.1 - css-render: 0.15.10 - date-fns: 2.28.0 - date-fns-tz: 1.3.4_date-fns@2.28.0 - evtd: 0.2.3 - highlight.js: 11.5.1 - lodash: 4.17.21 - lodash-es: 4.17.21 - seemly: 0.3.4 - treemate: 0.3.11 - vdirs: 0.1.8_vue@3.2.37 - vooks: 0.2.12_vue@3.2.37 - vue: 3.2.37 - vueuc: 0.4.44_vue@3.2.37 - dev: false - /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4100,15 +3965,6 @@ packages: hasBin: true dev: true - /pretty-format/27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: false - /promise/7.3.1: resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} dependencies: @@ -4225,10 +4081,6 @@ packages: engines: {node: '>=8'} dev: true - /react-is/17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: false - /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -4444,12 +4296,6 @@ packages: engines: {node: ^14.13.1 || >=16.0.0} dev: false - /seemly/0.3.4: - resolution: {integrity: sha512-/crL+UfbtYd6NdLdnf58xaABfeSRt5uKE4N1SFQAW7nIznOrJQchAaslJHxV8/iAfV0LWInrmxJBFdDb0c2/sw==} - dependencies: - '@types/jest': 27.5.2 - dev: false - /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -4650,6 +4496,7 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 + dev: true /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} @@ -4713,10 +4560,6 @@ packages: resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} dev: true - /treemate/0.3.11: - resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} - dev: false - /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -4741,7 +4584,7 @@ packages: '@tsconfig/node12': 1.0.10 '@tsconfig/node14': 1.0.2 '@tsconfig/node16': 1.0.3 - '@types/node': 17.0.43 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 acorn: 8.7.1 acorn-walk: 8.2.0 arg: 4.1.3 @@ -4908,15 +4751,6 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vdirs/0.1.8_vue@3.2.37: - resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} - peerDependencies: - vue: ^3.0.11 - dependencies: - evtd: 0.2.3 - vue: 3.2.37 - dev: false - /vite-plugin-compression/0.5.1_vite@2.9.9: resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} peerDependencies: @@ -5001,15 +4835,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /vooks/0.2.12_vue@3.2.37: - resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} - peerDependencies: - vue: ^3.0.0 - dependencies: - evtd: 0.2.3 - vue: 3.2.37 - dev: false - /vscode-css-languageservice/5.4.2: resolution: {integrity: sha512-DT7+7vfdT2HDNjDoXWtYJ0lVDdeDEdbMNdK4PKqUl2MS8g7PWt7J5G9B6k9lYox8nOfhCEjLnoNC3UKHHCR1lg==} dependencies: @@ -5183,7 +5008,7 @@ packages: eslint-visitor-keys: 3.3.0 espree: 9.3.2 esquery: 1.4.0 - lodash: 4.17.21 + lodash: registry.npmmirror.com/lodash/4.17.21 semver: 7.3.7 transitivePeerDependencies: - supports-color @@ -5266,21 +5091,6 @@ packages: vue: 3.2.37 dev: false - /vueuc/0.4.44_vue@3.2.37: - resolution: {integrity: sha512-2sLWo1Ow3DRKTDvGVlaWlf0KL+LOqeO6zlvb6nUxWxqj4VjUpg7sMtH+xtvBK+oOXH4goGt1RyLMaBVgPFpqHw==} - peerDependencies: - vue: ^3.0.11 - dependencies: - '@css-render/vue3-ssr': 0.15.10_vue@3.2.37 - '@juggle/resize-observer': 3.3.1 - css-render: 0.15.10 - evtd: 0.2.3 - seemly: 0.3.4 - vdirs: 0.1.8_vue@3.2.37 - vooks: 0.2.12_vue@3.2.37 - vue: 3.2.37 - dev: false - /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -5396,6 +5206,104 @@ packages: dependencies: tslib: 2.3.0 + registry.npmmirror.com/@css-render/plugin-bem/0.15.10_css-render@0.15.10: + resolution: {integrity: sha512-V7b08sM2PWJlXI7BJiVIa0Sg30H3u/jHay4AclNXfF2yRFwwb4ZJjggsMfzwj3WSihAdNf2WTqvOU5qsOD80Dg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.10.tgz} + id: registry.npmmirror.com/@css-render/plugin-bem/0.15.10 + name: '@css-render/plugin-bem' + version: 0.15.10 + peerDependencies: + css-render: ~0.15.10 + dependencies: + css-render: registry.npmmirror.com/css-render/0.15.10 + dev: false + + registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37: + resolution: {integrity: sha512-keGKnkB2nyVGoA8GezMKNsmvTGXEzgLOGGlgshwOTSEzd1dsROyZ2m/khJ9jV5zbzDM4rWeAWbWF0zwHemsJcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.10.tgz} + id: registry.npmmirror.com/@css-render/vue3-ssr/0.15.10 + name: '@css-render/vue3-ssr' + version: 0.15.10 + peerDependencies: + vue: ^3.0.11 + dependencies: + vue: 3.2.37 + dev: false + + registry.npmmirror.com/@emotion/hash/0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz} + name: '@emotion/hash' + version: 0.8.0 + dev: false + + registry.npmmirror.com/@juggle/resize-observer/3.3.1: + resolution: {integrity: sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz} + name: '@juggle/resize-observer' + version: 3.3.1 + dev: false + + registry.npmmirror.com/@types/lodash-es/4.17.6: + resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz} + name: '@types/lodash-es' + version: 4.17.6 + dependencies: + '@types/lodash': registry.npmmirror.com/@types/lodash/4.14.185 + dev: false + + registry.npmmirror.com/@types/lodash/4.14.185: + resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.185.tgz} + name: '@types/lodash' + version: 4.14.185 + dev: false + + registry.npmmirror.com/@types/node/17.0.43: + resolution: {integrity: sha512-jnUpgw8fL9kP2iszfIDyBQtw5Mf4/XSqy0Loc1J9pI14ejL83XcCEvSf50Gs/4ET0I9VCCDoOfufQysj0S66xA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-17.0.43.tgz} + name: '@types/node' + version: 17.0.43 + + registry.npmmirror.com/async-validator/4.1.1: + resolution: {integrity: sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.1.1.tgz} + name: async-validator + version: 4.1.1 + dev: false + + registry.npmmirror.com/css-render/0.15.10: + resolution: {integrity: sha512-6j5acvm81sXTHJiF47FNNICtDpF74YoWk1xEK3qQvdqgW6vc+OXrPqflL6m8f5GE6XuFYrbACNEd17kraCSBAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-render/-/css-render-0.15.10.tgz} + name: css-render + version: 0.15.10 + dependencies: + '@emotion/hash': registry.npmmirror.com/@emotion/hash/0.8.0 + '@types/node': registry.npmmirror.com/@types/node/17.0.43 + csstype: registry.npmmirror.com/csstype/3.0.11 + dev: false + + registry.npmmirror.com/csstype/2.6.20: + resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz} + name: csstype + version: 2.6.20 + + registry.npmmirror.com/csstype/3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/csstype/-/csstype-3.0.11.tgz} + name: csstype + version: 3.0.11 + dev: false + + registry.npmmirror.com/date-fns-tz/1.3.4_date-fns@2.28.0: + resolution: {integrity: sha512-O47vEyz85F2ax/ZdhMBJo187RivZGjH6V0cPjPzpm/yi6YffJg4upD/8ibezO11ezZwP3QYlBHh/t4JhRNx0Ow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/date-fns-tz/-/date-fns-tz-1.3.4.tgz} + id: registry.npmmirror.com/date-fns-tz/1.3.4 + name: date-fns-tz + version: 1.3.4 + peerDependencies: + date-fns: '>=2.0.0' + dependencies: + date-fns: registry.npmmirror.com/date-fns/2.28.0 + dev: false + + registry.npmmirror.com/date-fns/2.28.0: + resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/date-fns/-/date-fns-2.28.0.tgz} + name: date-fns + version: 2.28.0 + engines: {node: '>=0.11'} + dev: false + registry.npmmirror.com/echarts-wordcloud/2.0.0_echarts@5.3.3: resolution: {integrity: sha512-K7l6pTklqdW7ZWzT/1CS0KhBSINr/cd7c5N1fVMzZMwLQHEwT7x+nivK7g5hkVh7WNcAv4Dn6/ZS5zMKRozC1g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.0.0.tgz} id: registry.npmmirror.com/echarts-wordcloud/2.0.0 @@ -5627,6 +5535,12 @@ packages: dev: true optional: true + registry.npmmirror.com/evtd/0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/evtd/-/evtd-0.2.4.tgz} + name: evtd + version: 0.2.4 + dev: false + registry.npmmirror.com/fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz} name: fsevents @@ -5645,6 +5559,64 @@ packages: dev: true optional: true + registry.npmmirror.com/highlight.js/11.5.1: + resolution: {integrity: sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/highlight.js/-/highlight.js-11.5.1.tgz} + name: highlight.js + version: 11.5.1 + engines: {node: '>=12.0.0'} + dev: false + + registry.npmmirror.com/lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz} + name: lodash-es + version: 4.17.21 + dev: false + + registry.npmmirror.com/lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz} + name: lodash + version: 4.17.21 + + registry.npmmirror.com/naive-ui/2.33.3_vue@3.2.37: + resolution: {integrity: sha512-yz2aKdghMVadtvCSBXyjU2bAuGmwLEUcbzmXdUhSdtcbI6mT+mT8vRy43FnbJangPQ87v080q453vtnydNcnhA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/naive-ui/-/naive-ui-2.33.3.tgz} + id: registry.npmmirror.com/naive-ui/2.33.3 + name: naive-ui + version: 2.33.3 + peerDependencies: + vue: ^3.0.0 + dependencies: + '@css-render/plugin-bem': registry.npmmirror.com/@css-render/plugin-bem/0.15.10_css-render@0.15.10 + '@css-render/vue3-ssr': registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37 + '@types/lodash': registry.npmmirror.com/@types/lodash/4.14.185 + '@types/lodash-es': registry.npmmirror.com/@types/lodash-es/4.17.6 + async-validator: registry.npmmirror.com/async-validator/4.1.1 + css-render: registry.npmmirror.com/css-render/0.15.10 + date-fns: registry.npmmirror.com/date-fns/2.28.0 + date-fns-tz: registry.npmmirror.com/date-fns-tz/1.3.4_date-fns@2.28.0 + evtd: registry.npmmirror.com/evtd/0.2.4 + highlight.js: registry.npmmirror.com/highlight.js/11.5.1 + lodash: registry.npmmirror.com/lodash/4.17.21 + lodash-es: registry.npmmirror.com/lodash-es/4.17.21 + seemly: registry.npmmirror.com/seemly/0.3.6 + treemate: registry.npmmirror.com/treemate/0.3.11 + vdirs: registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37 + vooks: registry.npmmirror.com/vooks/0.2.12_vue@3.2.37 + vue: 3.2.37 + vueuc: registry.npmmirror.com/vueuc/0.4.49_vue@3.2.37 + dev: false + + registry.npmmirror.com/seemly/0.3.6: + resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/seemly/-/seemly-0.3.6.tgz} + name: seemly + version: 0.3.6 + dev: false + + registry.npmmirror.com/treemate/0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/treemate/-/treemate-0.3.11.tgz} + name: treemate + version: 0.3.11 + dev: false + registry.npmmirror.com/uglify-js/3.16.0: resolution: {integrity: sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uglify-js/-/uglify-js-3.16.0.tgz} name: uglify-js @@ -5654,3 +5626,45 @@ packages: requiresBuild: true dev: true optional: true + + registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vdirs/-/vdirs-0.1.8.tgz} + id: registry.npmmirror.com/vdirs/0.1.8 + name: vdirs + version: 0.1.8 + peerDependencies: + vue: ^3.0.11 + dependencies: + evtd: registry.npmmirror.com/evtd/0.2.4 + vue: 3.2.37 + dev: false + + registry.npmmirror.com/vooks/0.2.12_vue@3.2.37: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vooks/-/vooks-0.2.12.tgz} + id: registry.npmmirror.com/vooks/0.2.12 + name: vooks + version: 0.2.12 + peerDependencies: + vue: ^3.0.0 + dependencies: + evtd: registry.npmmirror.com/evtd/0.2.4 + vue: 3.2.37 + dev: false + + registry.npmmirror.com/vueuc/0.4.49_vue@3.2.37: + resolution: {integrity: sha512-WarAC44a/Yx78CxkAgROYLq+LkAeCGA/6wHidVoFmHLbzyF3SiP2nzRNGD/8zJeJInXv18EnWK6A//eGgMMq8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vueuc/-/vueuc-0.4.49.tgz} + id: registry.npmmirror.com/vueuc/0.4.49 + name: vueuc + version: 0.4.49 + peerDependencies: + vue: ^3.0.11 + dependencies: + '@css-render/vue3-ssr': registry.npmmirror.com/@css-render/vue3-ssr/0.15.10_vue@3.2.37 + '@juggle/resize-observer': registry.npmmirror.com/@juggle/resize-observer/3.3.1 + css-render: registry.npmmirror.com/css-render/0.15.10 + evtd: registry.npmmirror.com/evtd/0.2.4 + seemly: registry.npmmirror.com/seemly/0.3.6 + vdirs: registry.npmmirror.com/vdirs/0.1.8_vue@3.2.37 + vooks: registry.npmmirror.com/vooks/0.2.12_vue@3.2.37 + vue: 3.2.37 + dev: false From 7cf39a0e5840a2901709669c56b0a6196413f09b Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 1 Oct 2022 22:50:17 +0800 Subject: [PATCH 41/56] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/components/Decorates/Mores/FlipperNumber/index.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue index d831c4ed..c9e8d666 100644 --- a/src/packages/components/Decorates/Mores/FlipperNumber/index.vue +++ b/src/packages/components/Decorates/Mores/FlipperNumber/index.vue @@ -1,5 +1,4 @@ <template> - <!-- <n-countdown :duration="50000" :active="true" /> --> <n-space class="go-decorates-flipper-number" :size="flipperGap" align="center" justify="center"> <flipper :count="item" From f97112f1172ddedd51ead8eb36de97a64c01e351 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: Sun, 2 Oct 2022 20:28:21 +0800 Subject: [PATCH 42/56] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E7=B1=BB=E5=9E=8B=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/chart/ContentLayers/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/chart/ContentLayers/index.vue b/src/views/chart/ContentLayers/index.vue index d1a89269..ec1c4820 100644 --- a/src/views/chart/ContentLayers/index.vue +++ b/src/views/chart/ContentLayers/index.vue @@ -80,13 +80,13 @@ import { LayersGroupListItem } from './components/LayersGroupListItem/index' import { icon } from '@/plugins' -const { LayersIcon, ImageIcon, ImagesIcon, ListIcon } = icon.ionicons5 +const { LayersIcon, GridIcon, ListIcon } = icon.ionicons5 const chartLayoutStore = useChartLayoutStore() const chartEditStore = useChartEditStore() const { handleContextMenu, onClickOutSide } = useContextMenu() const layerModeList = [ - { label: '缩略图', icon: ImagesIcon, value: LayerModeEnum.THUMBNAIL }, + { label: '缩略图', icon: GridIcon, value: LayerModeEnum.THUMBNAIL }, { label: '文本列表', icon: ListIcon, value: LayerModeEnum.TEXT } ] From 2c0658ce5051188250a929aa05ced759665111f0 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sun, 2 Oct 2022 23:06:23 +0800 Subject: [PATCH 43/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=80=92?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E7=BB=84=E4=BB=B6=20Extraneous=20non-props?= =?UTF-8?q?=20attributes=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Decorates/Mores/CountDown/index.vue | 116 +++++++++--------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/src/packages/components/Decorates/Mores/CountDown/index.vue b/src/packages/components/Decorates/Mores/CountDown/index.vue index 8dde8706..263d6187 100644 --- a/src/packages/components/Decorates/Mores/CountDown/index.vue +++ b/src/packages/components/Decorates/Mores/CountDown/index.vue @@ -1,13 +1,30 @@ <template> - <n-countdown - ref="countdownRef" - :duration="totalDuration" - :render="renderCountdown" - :active="countdownActive" - v-show="false" - /> - <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> - <template v-if="showDay"> + <div> + <n-countdown + ref="countdownRef" + :duration="totalDuration" + :render="renderCountdown" + :active="countdownActive" + v-show="false" + /> + <n-space class="go-decorates-more-countdown" :size="flipperGap" align="center" justify="center"> + <template v-if="showDay"> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in daysFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">天</div> + <div v-else>:</div> + </template> <flipper :count="item" :width="flipperWidth" @@ -17,58 +34,43 @@ :radius="flipperRadius" :flip-type="flipperType" :duration="flipperSpeed" - v-for="(item, index) in daysFlipperData" + v-for="(item, index) in hoursFlipperData" :key="index" class="go-d-block" /> - <div v-if="style === '时分秒'">天</div> + <div v-if="style === '时分秒'">时</div> <div v-else>:</div> - </template> - <flipper - :count="item" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :flip-type="flipperType" - :duration="flipperSpeed" - v-for="(item, index) in hoursFlipperData" - :key="index" - class="go-d-block" - /> - <div v-if="style === '时分秒'">时</div> - <div v-else>:</div> - <flipper - :count="item" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :flip-type="flipperType" - :duration="flipperSpeed" - v-for="(item, index) in minutesFlipperData" - :key="index" - class="go-d-block" - /> - <div v-if="style === '时分秒'">分</div> - <div v-else>:</div> - <flipper - :count="item" - :width="flipperWidth" - :height="flipperHeight" - :front-color="flipperTextColor" - :back-color="flipperBgColor" - :radius="flipperRadius" - :flip-type="flipperType" - :duration="flipperSpeed" - v-for="(item, index) in secondsFlipperData" - :key="index" - class="go-d-block" - /> - <div v-if="style === '时分秒'">秒</div> - </n-space> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in minutesFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">分</div> + <div v-else>:</div> + <flipper + :count="item" + :width="flipperWidth" + :height="flipperHeight" + :front-color="flipperTextColor" + :back-color="flipperBgColor" + :radius="flipperRadius" + :flip-type="flipperType" + :duration="flipperSpeed" + v-for="(item, index) in secondsFlipperData" + :key="index" + class="go-d-block" + /> + <div v-if="style === '时分秒'">秒</div> + </n-space> + </div> </template> <script setup lang="ts"> From 2a9983047a5ae3dbd611f83b8826f4c7d75a822a 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: Wed, 5 Oct 2022 17:08:52 +0800 Subject: [PATCH 44/56] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E8=BD=AE=E6=92=AD=E8=A1=A8=E6=A0=BC=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=8D=E4=BC=9A=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tables/Tables/TableScrollBoard/config.vue | 79 +++++++------------ .../components/ChartSetting/index.vue | 3 +- 2 files changed, 30 insertions(+), 52 deletions(-) diff --git a/src/packages/components/Tables/Tables/TableScrollBoard/config.vue b/src/packages/components/Tables/Tables/TableScrollBoard/config.vue index 9dd1e12d..834cfb5b 100644 --- a/src/packages/components/Tables/Tables/TableScrollBoard/config.vue +++ b/src/packages/components/Tables/Tables/TableScrollBoard/config.vue @@ -28,57 +28,29 @@ <SettingItem name="显示行号"> <n-switch size="small" v-model:value="optionData.index" /> </SettingItem> - </SettingItemBox> <SettingItemBox name="配置" :alone="true"> <SettingItem name="表头数据"> - <n-input - v-model:value="header" - :min="1" - size="small" - placeholder="表头数据(英文','分割)" - ></n-input> + <n-input v-model:value="header" :min="1" size="small" placeholder="表头数据(英文','分割)"></n-input> </SettingItem> <SettingItem name="列对齐方式"> - <n-input - v-model:value="align" - :min="1" - size="small" - placeholder="对齐方式(英文','分割)" - ></n-input> + <n-input v-model:value="align" :min="1" size="small" placeholder="对齐方式(英文','分割)"></n-input> </SettingItem> <SettingItem name="列宽度"> - <n-input - v-model:value="columnWidth" - :min="1" - size="small" - placeholder="列宽度(英文','分割)" - ></n-input> + <n-input v-model:value="columnWidth" :min="1" size="small" placeholder="列宽度(英文','分割)"></n-input> </SettingItem> </SettingItemBox> <SettingItemBox name="样式"> <SettingItem name="表头背景色"> - <n-color-picker - size="small" - :modes="['hex']" - v-model:value="optionData.headerBGC" - ></n-color-picker> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker> </SettingItem> <SettingItem name="奇数行背景色"> - <n-color-picker - size="small" - :modes="['hex']" - v-model:value="optionData.oddRowBGC" - ></n-color-picker> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.oddRowBGC"></n-color-picker> </SettingItem> <SettingItem name="偶数行背景色"> - <n-color-picker - size="small" - :modes="['hex']" - v-model:value="optionData.evenRowBGC" - ></n-color-picker> + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.evenRowBGC"></n-color-picker> </SettingItem> </SettingItemBox> </CollapseItem> @@ -86,36 +58,43 @@ <script setup lang="ts"> import { PropType, ref, watch } from 'vue' -import { - CollapseItem, - SettingItemBox, - SettingItem, -} from '@/components/Pages/ChartItemSetting' +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' import { option } from './config' const props = defineProps({ optionData: { type: Object as PropType<typeof option>, - required: true, - }, + required: true + } }) -const header = ref(props.optionData.header.toString()) -const align = ref(props.optionData.align.toString()) -const columnWidth = ref(props.optionData.columnWidth.toString()) +const header = ref() +const align = ref() +const columnWidth = ref() -watch([header, align, columnWidth],([headerNew,alignNew,columnWidthNew],[headerOld,alignOld,columnWidthOld])=>{ - if(headerNew !== headerOld){ +watch( + () => props.optionData, + newData => { + header.value = props.optionData.header.toString() + align.value = props.optionData.align.toString() + columnWidth.value = props.optionData.columnWidth.toString() + }, + { + deep: false, + immediate: true + } +) + +watch([header, align, columnWidth], ([headerNew, alignNew, columnWidthNew], [headerOld, alignOld, columnWidthOld]) => { + if (headerNew !== headerOld) { props.optionData.header = headerNew.split(',') } - if(alignNew !== alignOld){ + if (alignNew !== alignOld) { props.optionData.align = alignNew.split(',') } - if(columnWidthNew !== columnWidthOld){ + if (columnWidthNew !== columnWidthOld) { // @ts-ignore props.optionData.columnWidth = columnWidthNew.split(',') } }) - - </script> diff --git a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue index 6718e34f..21c7d96a 100644 --- a/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue +++ b/src/views/chart/ContentConfigurations/components/ChartSetting/index.vue @@ -5,7 +5,7 @@ <!-- 尺寸 --> <size-setting :isGroup="targetData.isGroup" :chartAttr="targetData.attr"></size-setting> <!-- 位置 --> - <position-setting :chartAttr="targetData.attr" :canvasConfig="chartEditStore.getEditCanvasConfig"/> + <position-setting :chartAttr="targetData.attr" :canvasConfig="chartEditStore.getEditCanvasConfig" /> <!-- 滤镜 --> <styles-setting :isGroup="targetData.isGroup" :chartStyles="targetData.styles"></styles-setting> <!-- 自定义配置项 --> @@ -17,7 +17,6 @@ import { NameSetting, PositionSetting, SizeSetting, StylesSetting } from '@/components/Pages/ChartItemSetting' import { useTargetData } from '../hooks/useTargetData.hook' const { targetData, chartEditStore } = useTargetData() - </script> <style lang="scss" scoped> From 6f93b1f599b7c81334a93cd218d6aa2b83466fb5 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Wed, 5 Oct 2022 21:56:43 +0800 Subject: [PATCH 45/56] =?UTF-8?q?feat:=20=E7=BB=84=E4=BB=B6=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E5=B1=9E=E6=80=A7=E6=BB=A4=E9=95=9C=E4=B8=AD=E5=A2=9E?= =?UTF-8?q?=E6=B7=BB=E6=B7=B7=E5=90=88=E6=A8=A1=E5=BC=8F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/ChartItemSetting/StylesSetting.vue | 13 +++++-- src/packages/index.d.ts | 35 +++++++++++++++---- src/packages/public/publicConfig.ts | 3 ++ .../chartEditStore/chartEditStore.d.ts | 1 + .../modules/chartEditStore/chartEditStore.ts | 4 ++- src/utils/style.ts | 31 ++++++++++------ src/views/chart/ContentEdit/index.vue | 4 +-- .../components/PreviewRenderGroup/index.vue | 5 +-- .../components/PreviewRenderList/index.vue | 5 +-- 9 files changed, 75 insertions(+), 26 deletions(-) diff --git a/src/components/Pages/ChartItemSetting/StylesSetting.vue b/src/components/Pages/ChartItemSetting/StylesSetting.vue index 424efb70..184421c6 100644 --- a/src/components/Pages/ChartItemSetting/StylesSetting.vue +++ b/src/components/Pages/ChartItemSetting/StylesSetting.vue @@ -1,7 +1,7 @@ <template> <div v-show="isGroup"> <n-divider n-divider style="margin: 10px 0"></n-divider> - <n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag> + <n-tag type="warning"> 解散分组「 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 」也将消失!</n-tag> </div> <collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'"> @@ -69,8 +69,15 @@ </setting-item> </setting-item-box> + <!-- 混合模式 --> + <setting-item-box v-if="!isCanvas" name="混合模式" :alone="true"> + <setting-item name="视频组件需要底色透明一般选中滤色"> + <n-select size="small" v-model:value="chartStyles.blendMode" :options="BlendModeEnumList"></n-select> + </setting-item> + </setting-item-box> + <!-- 变换 --> - <setting-item-box v-if="!isCanvas" name="旋转°"> + <setting-item-box name="旋转°"> <setting-item name="Z轴(平面) - 旋转"> <!-- 透明度 --> <n-input-number @@ -132,7 +139,7 @@ <script setup lang="ts"> import { PropType } from 'vue' -import { PickCreateComponentType } from '@/packages/index.d' +import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d' import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting' const props = defineProps({ diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts index a565b12b..7b529588 100644 --- a/src/packages/index.d.ts +++ b/src/packages/index.d.ts @@ -38,8 +38,8 @@ interface EchartsDataType { // 组件状态 export interface StatusType { - lock: boolean, - hide: boolean, + lock: boolean + hide: boolean } // 滤镜/变换枚举 @@ -65,14 +65,36 @@ export enum FilterEnum { // 倾斜 SKEW_X = 'skewX', - SKEW_Y = 'skewY' + SKEW_Y = 'skewY', + + // 混合模式 + BLENDMODE = 'blendMode' } +export const BlendModeEnumList = [ + { label: '正常', value: 'normal' }, + { label: '正片叠底', value: 'multiply' }, + { label: '叠加', value: 'overlay' }, + { label: '滤色', value: 'screen' }, + { label: '变暗', value: 'darken' }, + { label: '变亮', value: 'lighten' }, + { label: '颜色减淡', value: 'color-dodge' }, + { label: '颜色加深', value: 'color-burn;' }, + { label: '强光', value: 'hard-light' }, + { label: '柔光', value: 'soft-light' }, + { label: '差值', value: 'difference' }, + { label: '排除', value: 'exclusion' }, + { label: '色相', value: 'hue' }, + { label: '饱和度', value: 'saturation' }, + { label: '颜色', value: 'color' }, + { label: '亮度', value: 'luminosity' } +] + // 组件实例类 export interface PublicConfigType { id: string isGroup: boolean - attr: { x: number; y: number; w: number; h: number; zIndex: number; offsetX: number; offsetY: number; } + attr: { x: number; y: number; w: number; h: number; zIndex: number; offsetX: number; offsetY: number } styles: { [FilterEnum.FILTERS_SHOW]: boolean [FilterEnum.OPACITY]: number @@ -87,11 +109,12 @@ export interface PublicConfigType { [FilterEnum.SKEW_X]: number [FilterEnum.SKEW_Y]: number + [FilterEnum.BLENDMODE]: string // 动画 animations: string[] - }, + } filter?: string - status: StatusType, + status: StatusType setPosition: Function } diff --git a/src/packages/public/publicConfig.ts b/src/packages/public/publicConfig.ts index 2657c600..7bf4ae75 100644 --- a/src/packages/public/publicConfig.ts +++ b/src/packages/public/publicConfig.ts @@ -66,6 +66,9 @@ export class PublicConfigClass implements PublicConfigType { skewX: 0, skewY: 0, + // 混合模式 + blendMode: 'normal', + // 动画 animations: [] } diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index f4a438e2..98e13668 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -77,6 +77,7 @@ export interface EditCanvasConfigType { [FilterEnum.ROTATE_Y]: number [FilterEnum.SKEW_X]: number [FilterEnum.SKEW_Y]: number + [FilterEnum.BLENDMODE]: string // 大屏宽度 [EditCanvasConfigEnum.WIDTH]: number // 大屏高度 diff --git a/src/store/modules/chartEditStore/chartEditStore.ts b/src/store/modules/chartEditStore/chartEditStore.ts index 5b37abfe..505c56f3 100644 --- a/src/store/modules/chartEditStore/chartEditStore.ts +++ b/src/store/modules/chartEditStore/chartEditStore.ts @@ -97,6 +97,8 @@ export const useChartEditStore = defineStore({ rotateY: 0, skewX: 0, skewY: 0, + // 混合模式 + blendMode: 'normal', // 默认背景色 background: undefined, backgroundImage: undefined, @@ -878,7 +880,7 @@ export const useChartEditStore = defineStore({ const targetItem = this.getComponentList[index] targetItem.status.hide = status - // 历史记录 + // 历史记录 if (isHistory) { status ? chartHistoryStore.createHideHistory([targetItem]) diff --git a/src/utils/style.ts b/src/utils/style.ts index be74ef00..8e8605d3 100644 --- a/src/utils/style.ts +++ b/src/utils/style.ts @@ -16,11 +16,11 @@ export const animationsClass = (animations: string[]) => { // * 滤镜 export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => { - if(!styles || !styles.filterShow) return {} + if (!styles || !styles.filterShow) return {} const { opacity, saturate, contrast, hueRotate, brightness } = styles return { opacity: opacity, - filter: `saturate(${saturate}) contrast(${contrast}) hue-rotate(${hueRotate}deg) brightness(${brightness})`, + filter: `saturate(${saturate}) contrast(${contrast}) hue-rotate(${hueRotate}deg) brightness(${brightness})` } } @@ -28,17 +28,28 @@ export const getFilterStyle = (styles?: StylesType | EditCanvasConfigType) => { export const getTransformStyle = (styles: StylesType) => { const { rotateZ, rotateX, rotateY, skewX, skewY } = styles return { - transform: `rotateZ(${rotateZ || 0}deg) rotateX(${rotateX || 0}deg) rotateY(${rotateY || 0}deg) skewX(${skewX || 0}deg) skewY(${skewY || 0}deg)`, + transform: `rotateZ(${rotateZ || 0}deg) rotateX(${rotateX || 0}deg) rotateY(${rotateY || 0}deg) skewX(${ + skewX || 0 + }deg) skewY(${skewY || 0}deg)` + } +} + +// * 混合模式 +export const getBlendModeStyle = (styles: StylesType) => { + if (!styles || !styles.filterShow) return {} + const { blendMode } = styles + return { + 'mix-blend-mode': blendMode } } /** - * * hsla 转换 + * * hsla 转换 * @param color 颜色 * @param alpha 默认1 - * @returns + * @returns */ -export function alpha(color: string, alpha = 1 ) { +export function alpha(color: string, alpha = 1) { return Color(color).alpha(alpha).toString() } @@ -47,7 +58,7 @@ export function alpha(color: string, alpha = 1 ) { * rgba(10, 10, 10, 0.8) -> rgba(10, 10, 10, 0.4) * @param color 颜色 * @param concentration 0~1 浓度 - * @returns + * @returns */ export function fade(color: string, fade: number) { return Color(color).fade(fade).toString() @@ -58,7 +69,7 @@ export function fade(color: string, fade: number) { * hsl(100, 50%, 10%) -> hsl(100, 50%, 50%) * @param color 颜色 * @param concentration 0~1 浓度 - * @returns + * @returns */ export function lighten(color: string, concentration: number) { return Color(color).lighten(concentration).toString() @@ -69,7 +80,7 @@ export function lighten(color: string, concentration: number) { * hsl(100, 50%, 50%) -> hsl(100, 50%, 25%) * @param color 颜色 * @param concentration 0~1 浓度 - * @returns + * @returns */ export function darken(color: string, concentration: number) { return Color(color).darken(concentration).toString() @@ -88,4 +99,4 @@ export const setHtmlTheme = (themeName?: string) => { } const designStore = useDesignStore() e.setAttribute('data-theme', designStore.themeName) -} \ No newline at end of file +} diff --git a/src/views/chart/ContentEdit/index.vue b/src/views/chart/ContentEdit/index.vue index 02242ab5..51c449b5 100644 --- a/src/views/chart/ContentEdit/index.vue +++ b/src/views/chart/ContentEdit/index.vue @@ -37,7 +37,7 @@ v-else :data-id="item.id" :index="index" - :style="useComponentStyle(item.attr, index)" + :style="{ ...useComponentStyle(item.attr, index), ...getBlendModeStyle(item.styles) }" :item="item" @click="mouseClickHandle($event, item)" @mousedown="mousedownHandle($event, item)" @@ -81,7 +81,7 @@ import { onMounted, computed } from 'vue' import { chartColors } from '@/settings/chartThemes/index' import { MenuEnum } from '@/enums/editPageEnum' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' -import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' +import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils' import { useContextMenu } from '@/views/chart/hooks/useContextMenu.hook' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' diff --git a/src/views/preview/components/PreviewRenderGroup/index.vue b/src/views/preview/components/PreviewRenderGroup/index.vue index 62b9b22a..a866fb7a 100644 --- a/src/views/preview/components/PreviewRenderGroup/index.vue +++ b/src/views/preview/components/PreviewRenderGroup/index.vue @@ -8,8 +8,9 @@ ...getComponentAttrStyle(item.attr, groupIndex), ...getFilterStyle(item.styles), ...getTransformStyle(item.styles), + ...getBlendModeStyle(item.styles), ...getStatusStyle(item.status) - }" + } as any" > <component :is="item.chartConfig.chartKey" @@ -24,7 +25,7 @@ <script setup lang="ts"> import { PropType } from 'vue' import { CreateComponentGroupType } from '@/packages/index.d' -import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' +import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils' import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils' const props = defineProps({ diff --git a/src/views/preview/components/PreviewRenderList/index.vue b/src/views/preview/components/PreviewRenderList/index.vue index 00e359ff..af0850a5 100644 --- a/src/views/preview/components/PreviewRenderList/index.vue +++ b/src/views/preview/components/PreviewRenderList/index.vue @@ -8,8 +8,9 @@ ...getComponentAttrStyle(item.attr, index), ...getFilterStyle(item.styles), ...getTransformStyle(item.styles), + ...getBlendModeStyle(item.styles), ...getStatusStyle(item.status) - }" + } as any" > <!-- 分组 --> <preview-render-group @@ -38,7 +39,7 @@ import { ChartEditStorageType } from '../../index.d' import { PreviewRenderGroup } from '../PreviewRenderGroup/index' import { CreateComponentGroupType } from '@/packages/index.d' import { chartColors } from '@/settings/chartThemes/index' -import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' +import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils' import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils' const props = defineProps({ From a7d433b62d6996b844391029b57f9c20194fc8f2 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: Fri, 7 Oct 2022 18:56:31 +0800 Subject: [PATCH 46/56] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96Naive=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E4=B9=8B=E5=90=8E=E9=A1=B5=E9=9D=A2=E4=B8=8D=E5=AF=B9?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GoSystemSet/index.vue | 7 +++++-- src/views/chart/ContentEdit/components/EditTools/index.vue | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/components/GoSystemSet/index.vue b/src/components/GoSystemSet/index.vue index 282fe84a..83df5a15 100644 --- a/src/components/GoSystemSet/index.vue +++ b/src/components/GoSystemSet/index.vue @@ -193,8 +193,11 @@ const handleChange = (e: MouseEvent, item: ListType) => { width: 110px; } @include deep() { - .n-list-item:not(:last-child) { - border-bottom: 0; + .n-list-item { + border-bottom: 0!important; + } + .n-list-item__divider { + display: none!important; } } } diff --git a/src/views/chart/ContentEdit/components/EditTools/index.vue b/src/views/chart/ContentEdit/components/EditTools/index.vue index a510d4e9..4c66016f 100644 --- a/src/views/chart/ContentEdit/components/EditTools/index.vue +++ b/src/views/chart/ContentEdit/components/EditTools/index.vue @@ -179,7 +179,8 @@ $asideBottom: 70px; } @include deep() { .n-button__icon { - margin-right: 4px; + margin-right: 0; + margin-left: 0; margin-bottom: 12px; } } From 0138db1b4f372bfd48d2fa2b0b54ec192421d911 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: Sat, 8 Oct 2022 09:17:42 +0800 Subject: [PATCH 47/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/enums/httpEnum.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/enums/httpEnum.ts b/src/enums/httpEnum.ts index ffc98893..c51d7e29 100644 --- a/src/enums/httpEnum.ts +++ b/src/enums/httpEnum.ts @@ -7,7 +7,7 @@ export enum ResultEnum { SERVER_ERROR = 500, SERVER_FORBIDDEN = 403, NOT_FOUND = 404, - TIMEOUT = 10042 + TIMEOUT = 60000 } // 数据相关 From f0f8c86b0daff5b63269e7c04fe7e9e93a9ed4c0 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 8 Oct 2022 11:43:38 +0800 Subject: [PATCH 48/56] =?UTF-8?q?fix:=20=E6=9B=BF=E6=8D=A2=20BLEND=5FMODE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/packages/index.d.ts | 4 ++-- src/store/modules/chartEditStore/chartEditStore.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/packages/index.d.ts b/src/packages/index.d.ts index 7b529588..1f95d50f 100644 --- a/src/packages/index.d.ts +++ b/src/packages/index.d.ts @@ -68,7 +68,7 @@ export enum FilterEnum { SKEW_Y = 'skewY', // 混合模式 - BLENDMODE = 'blendMode' + BLEND_MODE = 'blendMode' } export const BlendModeEnumList = [ @@ -109,7 +109,7 @@ export interface PublicConfigType { [FilterEnum.SKEW_X]: number [FilterEnum.SKEW_Y]: number - [FilterEnum.BLENDMODE]: string + [FilterEnum.BLEND_MODE]: string // 动画 animations: string[] } diff --git a/src/store/modules/chartEditStore/chartEditStore.d.ts b/src/store/modules/chartEditStore/chartEditStore.d.ts index 98e13668..4d0232cb 100644 --- a/src/store/modules/chartEditStore/chartEditStore.d.ts +++ b/src/store/modules/chartEditStore/chartEditStore.d.ts @@ -77,7 +77,7 @@ export interface EditCanvasConfigType { [FilterEnum.ROTATE_Y]: number [FilterEnum.SKEW_X]: number [FilterEnum.SKEW_Y]: number - [FilterEnum.BLENDMODE]: string + [FilterEnum.BLEND_MODE]: string // 大屏宽度 [EditCanvasConfigEnum.WIDTH]: number // 大屏高度 From bd7d3fe23edaff629b149e4e65507483f40622fa Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 8 Oct 2022 11:44:56 +0800 Subject: [PATCH 49/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=A0?= =?UTF-8?q?=E7=94=BB=E5=B8=83=E6=9C=AA=E9=BB=98=E8=AE=A4=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E8=89=B2=E6=88=96=E8=83=8C=E6=99=AF=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=AF=BC=E8=87=B4=E9=A2=84=E8=A7=88=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E6=B7=B7=E5=90=88=E7=8A=B6=E6=80=81=E6=9C=AA=E7=94=9F=E6=95=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/preview/utils/style.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/preview/utils/style.ts b/src/views/preview/utils/style.ts index 6cd25cba..507c7a22 100644 --- a/src/views/preview/utils/style.ts +++ b/src/views/preview/utils/style.ts @@ -33,7 +33,7 @@ export const getStatusStyle = (attr: StatusType) => { export const getEditCanvasConfigStyle = (canvas: EditCanvasConfigType) => { // 背景 const computedBackground = canvas.selectColor - ? { background: canvas.background } + ? { background: canvas.background || '#000000' } : { background: `url(${canvas.backgroundImage}) center center / cover no-repeat !important` } From a20f5400278012cd8d7c8a8df7ed09f62546a5a4 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 8 Oct 2022 11:54:54 +0800 Subject: [PATCH 50/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E4=B8=8D=E4=BD=BF=E7=94=A8=E6=97=8B=E8=BD=AC=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Pages/ChartItemSetting/StylesSetting.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Pages/ChartItemSetting/StylesSetting.vue b/src/components/Pages/ChartItemSetting/StylesSetting.vue index 184421c6..661970cc 100644 --- a/src/components/Pages/ChartItemSetting/StylesSetting.vue +++ b/src/components/Pages/ChartItemSetting/StylesSetting.vue @@ -77,7 +77,7 @@ </setting-item-box> <!-- 变换 --> - <setting-item-box name="旋转°"> + <setting-item-box v-if="!isCanvas" name="旋转°"> <setting-item name="Z轴(平面) - 旋转"> <!-- 透明度 --> <n-input-number From 4c2ca2b6355370b97882caad046b274c1acd9253 Mon Sep 17 00:00:00 2001 From: tnt group <dodu@live.cn> Date: Sat, 8 Oct 2022 12:56:07 +0800 Subject: [PATCH 51/56] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=86?= =?UTF-8?q?=E7=BB=84=E6=9C=AA=E5=BA=94=E7=94=A8=E6=B7=B7=E5=90=88=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/chart/ContentEdit/components/EditGroup/index.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/chart/ContentEdit/components/EditGroup/index.vue b/src/views/chart/ContentEdit/components/EditGroup/index.vue index 3a217c45..9276ec08 100644 --- a/src/views/chart/ContentEdit/components/EditGroup/index.vue +++ b/src/views/chart/ContentEdit/components/EditGroup/index.vue @@ -11,7 +11,8 @@ ...useComponentStyle(groupData.attr, groupIndex), ...useSizeStyle(groupData.attr), ...getFilterStyle(groupData.styles), - ...getTransformStyle(groupData.styles) + ...getTransformStyle(groupData.styles), + ...getBlendModeStyle(groupData.styles) }" @click="mouseClickHandle($event, groupData)" @mousedown="mousedownHandle($event, groupData)" @@ -55,7 +56,7 @@ import { MenuEnum } from '@/enums/editPageEnum' import { chartColors } from '@/settings/chartThemes/index' import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d' import { MenuOptionsItemType } from '@/views/chart/hooks/useContextMenu.hook.d' -import { animationsClass, getFilterStyle, getTransformStyle } from '@/utils' +import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' import { useContextMenu, divider } from '@/views/chart/hooks/useContextMenu.hook' import { useMouseHandle } from '../../hooks/useDrag.hook' From 8bf3c3bb758244b9e35efb4f207f3a86a774913c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=98=89=E5=A8=81?= <daidaibg@163.com> Date: Sat, 8 Oct 2022 14:52:56 +0800 Subject: [PATCH 52/56] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E7=BC=96=E8=BE=91=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=8D=97?= =?UTF-8?q?=E6=B5=B7=E7=BE=A4=E5=B2=9B=20=E9=A2=84=E8=A7=88=E6=97=B6?= =?UTF-8?q?=E4=BB=8D=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/Charts/Maps/MapBase/index.vue | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/packages/components/Charts/Maps/MapBase/index.vue b/src/packages/components/Charts/Maps/MapBase/index.vue index 20b1fdbc..8524684a 100644 --- a/src/packages/components/Charts/Maps/MapBase/index.vue +++ b/src/packages/components/Charts/Maps/MapBase/index.vue @@ -61,10 +61,14 @@ const getGeojson = (regionId: string) => { //异步时先注册空的 保证初始化不报错 registerMap(props.chartConfig.option.mapRegion.adcode, { geoJSON: {} as any, specialAreas: {} }) -// 进行更换初始化地图 +// 进行更换初始化地图 如果为china 单独处理 const registerMapInitAsync = async () => { await nextTick() - await getGeojson(props.chartConfig.option.mapRegion.adcode) + if (props.chartConfig.option.mapRegion.adcode!="china") { + await getGeojson(props.chartConfig.option.mapRegion.adcode) + }else{ + await hainanLandsHandle(props.chartConfig.option.mapRegion.showHainanIsLands) + } vEchartsSetOption() } registerMapInitAsync() @@ -85,7 +89,14 @@ const dataSetHandle = async (dataset: any) => { isPreview() && vEchartsSetOption() } - +// 处理海南群岛 +const hainanLandsHandle=async(newData:boolean)=>{ + if (newData) { + await getGeojson('china') + } else { + registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} }) + } +} //监听 dataset 数据发生变化 watch( () => props.chartConfig.option.dataset, @@ -102,11 +113,7 @@ watch( watch( () => props.chartConfig.option.mapRegion.showHainanIsLands, async newData => { - if (newData) { - await getGeojson('china') - } else { - registerMap('china', { geoJSON: mapJsonWithoutHainanIsLands as any, specialAreas: {} }) - } + await hainanLandsHandle(newData) vEchartsSetOption() }, { From 778be20ddcdf7a0e950229cadf5c8145c40d6cbe 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: Sat, 8 Oct 2022 20:32:36 +0800 Subject: [PATCH 53/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/ChartItemSetting/StylesSetting.vue | 4 +- .../components/CanvasPage/index.vue | 178 ++++++++++-------- src/views/preview/utils/style.ts | 2 +- 3 files changed, 97 insertions(+), 87 deletions(-) diff --git a/src/components/Pages/ChartItemSetting/StylesSetting.vue b/src/components/Pages/ChartItemSetting/StylesSetting.vue index 661970cc..672755c4 100644 --- a/src/components/Pages/ChartItemSetting/StylesSetting.vue +++ b/src/components/Pages/ChartItemSetting/StylesSetting.vue @@ -157,14 +157,12 @@ const props = defineProps({ } }) -// 百分比格式化persen +// 百分比格式化 person const sliderFormatTooltip = (v: string) => { - // @ts-ignore return `${(parseFloat(v) * 100).toFixed(0)}%` } // 角度格式化 const degFormatTooltip = (v: string) => { - // @ts-ignore return `${v}deg` } </script> diff --git a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue index 040823e1..5d4bcc23 100644 --- a/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue +++ b/src/views/chart/ContentConfigurations/components/CanvasPage/index.vue @@ -30,17 +30,11 @@ :onBeforeUpload="beforeUploadHandle" > <n-upload-dragger> - <img - v-if="canvasConfig.backgroundImage" - class="upload-show" - :src="canvasConfig.backgroundImage" - alt="背景" - /> + <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="canvasConfig.backgroundImage" alt="背景" /> <div class="upload-img" v-show="!canvasConfig.backgroundImage"> <img src="@/assets/images/canvas/noImage.png" /> <n-text class="upload-desc" depth="3"> - 背景图需小于 {{ backgroundImageSize }}M ,格式为 png/jpg/gif - 的文件 + 背景图需小于 {{ backgroundImageSize }}M ,格式为 png/jpg/gif 的文件 </n-text> </div> </n-upload-dragger> @@ -48,43 +42,52 @@ </n-card> <n-space vertical :size="12"> <n-space> - <n-text>背景色</n-text> - <n-color-picker - style="width: 326px;" - :showPreview="true" - :swatches="swatchesColors" - v-model:value="canvasConfig.background" - ></n-color-picker> + <n-text>背景颜色</n-text> + <div class="picker-height"> + <n-color-picker + v-if="!switchSelectColorLoading" + size="small" + style="width: 250px" + v-model:value="canvasConfig.background" + :showPreview="true" + :swatches="swatchesColors" + ></n-color-picker> + </div> </n-space> <n-space> - <n-text>颜色应用</n-text> - <n-switch + <n-text>应用类型</n-text> + <n-select size="small" - v-model:value="canvasConfig.selectColor" - :loading="switchSelectColorLoading" - :round="false" + style="width: 250px" + v-model:value="selectColorValue" :disabled="!canvasConfig.backgroundImage" - :onUpdate="switchSelectColorHandle" - ></n-switch> + :options="selectColorOptions" + @update:value="selectColorValueHandle" + /> </n-space> <n-space> <n-text>背景控制</n-text> - <n-button size="small" :disabled="!canvasConfig.backgroundImage" @click="clearImage">清除背景图</n-button> - <n-button size="small" :disabled="!canvasConfig.background" @click="clearColor">清除颜色</n-button> + <n-button class="clear-btn" size="small" :disabled="!canvasConfig.backgroundImage" @click="clearImage"> + 清除背景 + </n-button> + <n-button class="clear-btn" size="small" :disabled="!canvasConfig.background" @click="clearColor"> + 清除颜色 + </n-button> </n-space> <n-space> <n-text>预览方式</n-text> <n-button-group> - <n-button - ghost + <n-button v-for="item in previewTypeList" :key="item.key" :type="canvasConfig.previewScaleType === item.key ? 'primary' : 'tertiary'" + ghost size="small" - @click="selectPreviewType(item.key)"> + @click="selectPreviewType(item.key)" + > <n-tooltip :show-arrow="false" trigger="hover"> <template #trigger> - <n-icon size="18"> + <n-icon class="select-preview-icon" size="18"> <component :is="item.icon"></component> </n-icon> </template> @@ -97,7 +100,7 @@ <!-- 滤镜 --> <styles-setting :isCanvas="true" :chartStyles="canvasConfig"></styles-setting> - <n-divider style="margin: 10px 0;"></n-divider> + <n-divider style="margin: 10px 0"></n-divider> <!-- 主题选择和全局配置 --> <n-tabs class="tabs-box" size="small" type="segment"> @@ -123,7 +126,7 @@ </template> <script setup lang="ts"> -import { ref, nextTick } from 'vue' +import { ref, nextTick, watch } from 'vue' import { backgroundImageSize } from '@/settings/designSetting' import { FileTypeEnum } from '@/enums/fileTypeEnum' import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' @@ -143,23 +146,25 @@ const editCanvas = chartEditStore.getEditCanvas const uploadFileListRef = ref() const switchSelectColorLoading = ref(false) +const selectColorValue = ref(0) -const ChartThemeColor = loadAsyncComponent(() => - import('./components/ChartThemeColor/index.vue') -) +const ChartThemeColor = loadAsyncComponent(() => import('./components/ChartThemeColor/index.vue')) -// 北京默认展示颜色列表 -const swatchesColors = [ - '#232324', - '#2a2a2b', - '#313132', - '#373739', - '#757575', - '#e0e0e0', - '#eeeeee', - '#fafafa' +// 默认应用类型 +const selectColorOptions = [ + { + label: '应用颜色', + value: 0 + }, + { + label: '应用背景', + value: 1 + } ] +// 默认展示颜色列表 +const swatchesColors = ['#232324', '#2a2a2b', '#313132', '#373739', '#757575', '#e0e0e0', '#eeeeee', '#fafafa'] + const globalTabList = [ { key: 'ChartTheme', @@ -193,9 +198,19 @@ const previewTypeList = [ title: '铺满', icon: FitToScreenIcon, desc: '强行拉伸画面,填充所有视图' - }, + } ] +watch( + () => canvasConfig.selectColor, + newValue => { + selectColorValue.value = newValue ? 0 : 1 + }, + { + immediate: true + } +) + // 画布尺寸规则 const validator = (x: number) => x > 50 @@ -212,9 +227,7 @@ const beforeUploadHandle = async ({ file }) => { const size = file.file.size if (size > 1024 * 1024 * backgroundImageSize) { - window['$message'].warning( - `图片超出 ${backgroundImageSize}M 限制,请重新上传!` - ) + window['$message'].warning(`图片超出 ${backgroundImageSize}M 限制,请重新上传!`) return false } if (type !== FileTypeEnum.PNG && type !== FileTypeEnum.JPEG && type !== FileTypeEnum.GIF) { @@ -224,38 +237,32 @@ const beforeUploadHandle = async ({ file }) => { return true } +// 应用颜色 +const selectColorValueHandle = (value: number) => { + canvasConfig.selectColor = value == 0 +} + // 清除背景 const clearImage = () => { - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.BACKGROUND_IMAGE, - undefined - ) - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.SELECT_COLOR, - true - ) + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, undefined) + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, true) } -// 清除颜色 -const clearColor = () => { - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.BACKGROUND, - undefined - ) - if (canvasConfig.backgroundImage) { - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.SELECT_COLOR, - false - ) - } -} - -// 启用/关闭 颜色 +// 启用/关闭 颜色(强制更新) const switchSelectColorHandle = () => { switchSelectColorLoading.value = true setTimeout(() => { switchSelectColorLoading.value = false - }, 1000) + }) +} + +// 清除颜色 +const clearColor = () => { + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND, undefined) + if (canvasConfig.backgroundImage) { + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false) + } + switchSelectColorHandle() } // 自定义上传操作 @@ -264,14 +271,8 @@ const customRequest = (options: UploadCustomRequestOptions) => { nextTick(() => { if (file.file) { const ImageUrl = fileToUrl(file.file) - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.BACKGROUND_IMAGE, - ImageUrl - ) - chartEditStore.setEditCanvasConfig( - EditCanvasConfigEnum.SELECT_COLOR, - false - ) + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl) + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false) } else { window['$message'].error('添加图片失败,请稍后重试!') } @@ -285,8 +286,8 @@ const selectPreviewType = (key: PreviewScaleEnum) => { </script> <style lang="scss" scoped> -$updloadWidth: 326px; -$updloadHeight: 193px; +$uploadWidth: 326px; +$uploadHeight: 193px; @include go(canvas-setting) { padding-top: 20px; .upload-box { @@ -299,12 +300,12 @@ $updloadHeight: 193px; } .n-upload-dragger { padding: 5px; - width: $updloadWidth; + width: $uploadWidth; } } .upload-show { width: -webkit-fill-available; - height: $updloadHeight; + height: $uploadHeight; border-radius: 5px; } .upload-img { @@ -322,6 +323,17 @@ $updloadHeight: 193px; .icon-position { padding-top: 2px; } + .picker-height { + min-height: 35px; + } + .clear-btn { + padding-left: 2.25em; + padding-right: 2.25em; + } + .select-preview-icon { + padding-right: .68em; + padding-left: .68em; + } .tabs-box { margin-top: 20px; } diff --git a/src/views/preview/utils/style.ts b/src/views/preview/utils/style.ts index 507c7a22..6cd25cba 100644 --- a/src/views/preview/utils/style.ts +++ b/src/views/preview/utils/style.ts @@ -33,7 +33,7 @@ export const getStatusStyle = (attr: StatusType) => { export const getEditCanvasConfigStyle = (canvas: EditCanvasConfigType) => { // 背景 const computedBackground = canvas.selectColor - ? { background: canvas.background || '#000000' } + ? { background: canvas.background } : { background: `url(${canvas.backgroundImage}) center center / cover no-repeat !important` } From 9ee62dffcafc7a983d092622bb6c668c9623e51d 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: Sat, 8 Oct 2022 20:48:52 +0800 Subject: [PATCH 54/56] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E8=A7=A3=E9=94=81=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/chart/hooks/useContextMenu.hook.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/chart/hooks/useContextMenu.hook.ts b/src/views/chart/hooks/useContextMenu.hook.ts index 2bf8fdf8..e0aa782e 100644 --- a/src/views/chart/hooks/useContextMenu.hook.ts +++ b/src/views/chart/hooks/useContextMenu.hook.ts @@ -199,7 +199,9 @@ const handleContextMenu = ( target = target.parentNode } - // 展示列表 + chartEditStore.setTargetSelectChart(targetInstance && targetInstance.id) + + // 隐藏旧列表 chartEditStore.setRightMenuShow(false) // * 多选默认选项 From 3e5e1a9b41ce9b47b04676d57be34c2c766c0318 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: Sat, 8 Oct 2022 20:49:08 +0800 Subject: [PATCH 55/56] =?UTF-8?q?style:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GoSystemSet/index.vue | 2 +- src/components/Pages/ChartItemSetting/StylesSetting.vue | 2 +- src/views/chart/ContentEdit/components/EditGroup/index.vue | 2 +- src/views/chart/ContentEdit/index.vue | 5 ++++- src/views/preview/components/PreviewRenderGroup/index.vue | 6 +++--- src/views/preview/components/PreviewRenderList/index.vue | 4 ++-- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/components/GoSystemSet/index.vue b/src/components/GoSystemSet/index.vue index 83df5a15..180836a1 100644 --- a/src/components/GoSystemSet/index.vue +++ b/src/components/GoSystemSet/index.vue @@ -190,7 +190,7 @@ const handleChange = (e: MouseEvent, item: ListType) => { width: 100px; } .select-min-width { - width: 110px; + width: 115px; } @include deep() { .n-list-item { diff --git a/src/components/Pages/ChartItemSetting/StylesSetting.vue b/src/components/Pages/ChartItemSetting/StylesSetting.vue index 672755c4..b943ca71 100644 --- a/src/components/Pages/ChartItemSetting/StylesSetting.vue +++ b/src/components/Pages/ChartItemSetting/StylesSetting.vue @@ -72,7 +72,7 @@ <!-- 混合模式 --> <setting-item-box v-if="!isCanvas" name="混合模式" :alone="true"> <setting-item name="视频组件需要底色透明一般选中滤色"> - <n-select size="small" v-model:value="chartStyles.blendMode" :options="BlendModeEnumList"></n-select> + <n-select v-model:value="chartStyles.blendMode" size="small" filterable :options="BlendModeEnumList"></n-select> </setting-item> </setting-item-box> diff --git a/src/views/chart/ContentEdit/components/EditGroup/index.vue b/src/views/chart/ContentEdit/components/EditGroup/index.vue index 9276ec08..5d7f1462 100644 --- a/src/views/chart/ContentEdit/components/EditGroup/index.vue +++ b/src/views/chart/ContentEdit/components/EditGroup/index.vue @@ -12,7 +12,7 @@ ...useSizeStyle(groupData.attr), ...getFilterStyle(groupData.styles), ...getTransformStyle(groupData.styles), - ...getBlendModeStyle(groupData.styles) + ...getBlendModeStyle(groupData.styles) as any }" @click="mouseClickHandle($event, groupData)" @mousedown="mousedownHandle($event, groupData)" diff --git a/src/views/chart/ContentEdit/index.vue b/src/views/chart/ContentEdit/index.vue index 51c449b5..520a558c 100644 --- a/src/views/chart/ContentEdit/index.vue +++ b/src/views/chart/ContentEdit/index.vue @@ -37,7 +37,10 @@ v-else :data-id="item.id" :index="index" - :style="{ ...useComponentStyle(item.attr, index), ...getBlendModeStyle(item.styles) }" + :style="{ + ...useComponentStyle(item.attr, index), + ...getBlendModeStyle(item.styles) as any + }" :item="item" @click="mouseClickHandle($event, item)" @mousedown="mousedownHandle($event, item)" diff --git a/src/views/preview/components/PreviewRenderGroup/index.vue b/src/views/preview/components/PreviewRenderGroup/index.vue index a866fb7a..81790f63 100644 --- a/src/views/preview/components/PreviewRenderGroup/index.vue +++ b/src/views/preview/components/PreviewRenderGroup/index.vue @@ -8,9 +8,9 @@ ...getComponentAttrStyle(item.attr, groupIndex), ...getFilterStyle(item.styles), ...getTransformStyle(item.styles), - ...getBlendModeStyle(item.styles), - ...getStatusStyle(item.status) - } as any" + ...getStatusStyle(item.status), + ...getBlendModeStyle(item.styles) as any + }" > <component :is="item.chartConfig.chartKey" diff --git a/src/views/preview/components/PreviewRenderList/index.vue b/src/views/preview/components/PreviewRenderList/index.vue index af0850a5..4335ab96 100644 --- a/src/views/preview/components/PreviewRenderList/index.vue +++ b/src/views/preview/components/PreviewRenderList/index.vue @@ -8,8 +8,8 @@ ...getComponentAttrStyle(item.attr, index), ...getFilterStyle(item.styles), ...getTransformStyle(item.styles), - ...getBlendModeStyle(item.styles), - ...getStatusStyle(item.status) + ...getStatusStyle(item.status), + ...getBlendModeStyle(item.styles) as any } as any" > <!-- 分组 --> From 3e10592a74d9c3747d6dda3924828f78d1bd5886 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: Sat, 8 Oct 2022 20:58:48 +0800 Subject: [PATCH 56/56] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=B7=B7?= =?UTF-8?q?=E5=90=88=E6=8F=90=E7=A4=BA=E7=9A=84=E5=B1=95=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/ChartItemSetting/StylesSetting.vue | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/components/Pages/ChartItemSetting/StylesSetting.vue b/src/components/Pages/ChartItemSetting/StylesSetting.vue index b943ca71..27275449 100644 --- a/src/components/Pages/ChartItemSetting/StylesSetting.vue +++ b/src/components/Pages/ChartItemSetting/StylesSetting.vue @@ -70,8 +70,19 @@ </setting-item-box> <!-- 混合模式 --> - <setting-item-box v-if="!isCanvas" name="混合模式" :alone="true"> - <setting-item name="视频组件需要底色透明一般选中滤色"> + <setting-item-box v-if="!isCanvas" :alone="true"> + <template #name> + <n-text>混合</n-text> + <n-tooltip trigger="hover"> + <template #trigger> + <n-icon size="21" :depth="3"> + <help-outline-icon></help-outline-icon> + </n-icon> + </template> + <n-text>视频组件需要底色透明一般选中滤色</n-text> + </n-tooltip> + </template> + <setting-item> <n-select v-model:value="chartStyles.blendMode" size="small" filterable :options="BlendModeEnumList"></n-select> </setting-item> </setting-item-box> @@ -141,6 +152,7 @@ import { PropType } from 'vue' import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d' import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting' +import { icon } from '@/plugins' const props = defineProps({ isGroup: { @@ -157,6 +169,8 @@ const props = defineProps({ } }) +const { HelpOutlineIcon } = icon.ionicons5 + // 百分比格式化 person const sliderFormatTooltip = (v: string) => { return `${(parseFloat(v) * 100).toFixed(0)}%`