diff --git a/src/packages/components/Informations/Mores/Carousel/config.ts b/src/packages/components/Informations/Mores/Carousel/config.ts new file mode 100644 index 00000000..78a6f284 --- /dev/null +++ b/src/packages/components/Informations/Mores/Carousel/config.ts @@ -0,0 +1,47 @@ +import { PublicConfigClass } from '@/packages/public' +import { CreateComponentType } from '@/packages/index.d' +import { CarouselConfig } from './index' +import cloneDeep from 'lodash/cloneDeep' +import logo from '@/assets/logo.png' + +// 示例图片资源 +const modules = import.meta.globEager("./images/*"); +const dataset = [logo] +for (var item in modules) { + dataset.push(modules[item].default) +} + +export const option = { + // 图片资源列表 + dataset: dataset, + // 自动播放 + autoplay: true, + // 自动播放的间隔(ms) + interval: 5000, + // 每页显示的图片数量 + slidesPerview: 1, + // 轮播方向 + direction: "horizontal", + // 拖曳切换 + draggable: true, + // 居中显示 + centeredSlides: false, + // 过渡效果 + effect: "slide", + // 是否显示指示点 + showDots: true, + // 指示器样式 + dotType: "dot", + // 指示器位置 + dotPlacement: "bottom", + // 显示箭头 + showArrow: false, + // 图片样式 + fit: "contain", +} + +export default class Config extends PublicConfigClass implements CreateComponentType { + public key = CarouselConfig.key + public chartConfig = cloneDeep(CarouselConfig) + public option = cloneDeep(option) +} diff --git a/src/packages/components/Informations/Mores/Carousel/config.vue b/src/packages/components/Informations/Mores/Carousel/config.vue new file mode 100644 index 00000000..da3f7492 --- /dev/null +++ b/src/packages/components/Informations/Mores/Carousel/config.vue @@ -0,0 +1,176 @@ +<template> + <collapse-item name="属性" :expanded="true"> + <setting-item-box name="路径" :alone="true"> + <setting-item v-for="item, index in optionData.dataset" :key="index"> + <n-input-group> + <n-input v-model:value="optionData.dataset[index]" size="small" placeholder="请输入图片地址"></n-input> + <n-button ghost @click="optionData.dataset.splice(index, 1)"> + - + </n-button> + </n-input-group> + </setting-item> + <setting-item> + <n-button size="small" @click="optionData.dataset.push('')"> + + + </n-button> + </setting-item> + </setting-item-box> + <setting-item-box name="播放器"> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.autoplay" size="small" /> + <n-text>自动播放</n-text> + </n-space> + </setting-item> + <!-- 开启自动播放时,设置间隔时间 --> + <setting-item name="间隔时间"> + <n-input-number v-model:value="optionData.interval" size="small" placeholder=""></n-input-number> + </setting-item> + <setting-item name="轮播方向"> + <n-select v-model:value="optionData.direction" :options="directions" placeholder="选择方向" /> + </setting-item> + <setting-item name="过渡效果"> + <n-select v-model:value="optionData.effect" :options="effects" placeholder="效果" /> + </setting-item> + <setting-item name="每页数量"> + <n-input-number v-model:value="optionData.slidesPerview" size="small" placeholder=""></n-input-number> + </setting-item> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.centeredSlides" size="small" /> + <n-text>居中显示</n-text> + </n-space> + </setting-item> + <setting-item name="图片样式"> + <n-select v-model:value="optionData.fit" :options="fitList" placeholder="样式" /> + </setting-item> + </setting-item-box> + + <setting-item-box name="指示器"> + <setting-item name="样式"> + <n-select v-model:value="optionData.dotType" :options="dotTypes" placeholder="选择样式" /> + </setting-item> + <setting-item name="位置"> + <n-select v-model:value="optionData.dotPlacement" :options="dotPlacements" placeholder="选择位置" /> + </setting-item> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.showDots" size="small" /> + <n-text>显示</n-text> + </n-space> + </setting-item> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.showArrow" size="small" /> + <n-text>箭头</n-text> + </n-space> + </setting-item> + <setting-item> + <n-space> + <n-switch v-model:value="optionData.draggable" size="small" /> + <n-text>拖曳切换</n-text> + </n-space> + </setting-item> + </setting-item-box> + + </collapse-item> +</template> + +<script setup lang="ts"> +import { PropType } from 'vue' +import { option } from './config' +import { + CollapseItem, + SettingItemBox, + SettingItem +} from '@/components/Pages/ChartItemSetting' + +const props = defineProps({ + optionData: { + type: Object as PropType<typeof option>, + required: true + } +}) + +// 字典 +const dotTypes = [ + { + label: "点", + value: "dot" + }, + { + label: "线", + value: "line" + } +] +const directions = [ + { + label: "水平方向", + value: "horizontal" + }, + { + label: "垂直方向", + value: "vertical" + } +] +const effects = [ + { + label: "slide", + value: "slide" + }, + { + label: "fade", + value: "fade" + }, + { + label: "card", + value: "card" + }, + { + label: "custom", + value: "custom" + } +] +const dotPlacements = [ + { + label: "上边", + value: "top" + }, + { + label: "下边", + value: "bottom" + }, + { + label: "左边", + value: "left" + }, + { + label: "右边", + value: "right" + } +] + +// 适应类型 +const fitList = [ + { + value: 'fill', + label: 'fill' + }, + { + value: 'contain', + label: 'contain' + }, + { + value: 'cover', + label: 'cover' + }, + { + value: 'scale-down', + label: 'scale-down' + }, + { + value: 'none', + label: 'none' + }, +] +</script> diff --git a/src/packages/components/Informations/Mores/Carousel/images/carousel.png b/src/packages/components/Informations/Mores/Carousel/images/carousel.png new file mode 100644 index 00000000..95f366b1 Binary files /dev/null and b/src/packages/components/Informations/Mores/Carousel/images/carousel.png differ diff --git a/src/packages/components/Informations/Mores/Carousel/images/carousel2.png b/src/packages/components/Informations/Mores/Carousel/images/carousel2.png new file mode 100644 index 00000000..d8a6859f Binary files /dev/null and b/src/packages/components/Informations/Mores/Carousel/images/carousel2.png differ diff --git a/src/packages/components/Informations/Mores/Carousel/index.ts b/src/packages/components/Informations/Mores/Carousel/index.ts new file mode 100644 index 00000000..fbb8d35c --- /dev/null +++ b/src/packages/components/Informations/Mores/Carousel/index.ts @@ -0,0 +1,14 @@ +import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' +import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d' + +export const CarouselConfig: ConfigType = { + key: 'Carousel', + chartKey: 'VCarousel', + conKey: 'VCCarousel', + title: '轮播图', + category: ChatCategoryEnum.MORE, + categoryName: ChatCategoryEnumName.MORE, + package: PackagesCategoryEnum.INFORMATIONS, + chartFrame: ChartFrameEnum.NAIVE_UI, + image: 'photo.png' +} diff --git a/src/packages/components/Informations/Mores/Carousel/index.vue b/src/packages/components/Informations/Mores/Carousel/index.vue new file mode 100644 index 00000000..3018fbc2 --- /dev/null +++ b/src/packages/components/Informations/Mores/Carousel/index.vue @@ -0,0 +1,47 @@ +<template> + <div> + <n-carousel :autoplay="autoplay" :interval="interval" :centered-slides="centeredSlides" :direction="direction" + :dot-placement="dotPlacement" :dot-type="dotType" :draggable="draggable" :effect="effect" + :slides-per-view="slidesPerview" :show-arrow="showArrow" :show-dots="showDots"> + <n-image v-for="url in option.dataset" :object-fit="fit" preview-disabled :src="url" + :fallback-src="requireErrorImg()" :width="w" :height="h"></n-image> + </n-carousel> + </div> +</template> +<script setup lang="ts"> +import { PropType, toRefs, shallowReactive, watch } from 'vue' +import { CreateComponentType } from '@/packages/index.d' +import { requireErrorImg } from '@/utils' +import { useChartDataFetch } from '@/hooks' +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' +import { option as configOption } from './config' + +const props = defineProps({ + chartConfig: { + type: Object as PropType<CreateComponentType>, + required: true + } +}) + +const option = shallowReactive({ + dataset: configOption.dataset +}) + +const { w, h } = toRefs(props.chartConfig.attr) +const { autoplay, interval, slidesPerview, direction, draggable, centeredSlides, effect, dotType, dotPlacement, showArrow, showDots, fit } = toRefs(props.chartConfig.option) + +watch( + () => props.chartConfig.option.dataset, + (newData: any) => { + option.dataset = newData + }, + { + immediate: true, + deep: false + } +) + +useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => { + option.dataset = newData +}) +</script> diff --git a/src/packages/components/Informations/Mores/index.ts b/src/packages/components/Informations/Mores/index.ts index 8fadc441..0e842ce0 100644 --- a/src/packages/components/Informations/Mores/index.ts +++ b/src/packages/components/Informations/Mores/index.ts @@ -2,5 +2,6 @@ import { ImageConfig } from './Image/index' import { IframeConfig } from './Iframe/index' import { VideoConfig } from './Video/index' import { WordCloudConfig } from './WordCloud/index' +import { CarouselConfig } from './Carousel/index' -export default [WordCloudConfig, ImageConfig, VideoConfig, IframeConfig] +export default [WordCloudConfig, ImageConfig, VideoConfig, IframeConfig, CarouselConfig]