修改自定义数据显示

v1.0.0
于肖磊 2024-09-23 17:31:38 +08:00
parent b903cb4cbb
commit efe8ac7255
9 changed files with 86 additions and 76 deletions

View File

@ -1,18 +1,12 @@
<template> <template>
<div class="img-outer re oh" :style="com_style"> <div class="img-outer re oh" :style="com_style">
<div :style="text_style" class="break"> <div :style="icon_style" class="flex-row">
<template v-if="form.is_rich_text == '1'"> <icon :name="form.icon_class" :color="form.icon_color" :size="form.icon_size"></icon>
<div class="rich-text-content" :innerHTML="text_title"></div>
</template>
<template v-else>
{{ text_title }}
</template>
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { radius_computer, padding_computer } from '@/utils'; import { radius_computer, padding_computer } from '@/utils';
import { isEmpty } from 'lodash';
const props = defineProps({ const props = defineProps({
value: { value: {
type: Object, type: Object,
@ -34,36 +28,23 @@ const props = defineProps({
}); });
// //
const form = reactive(props.value); const form = reactive(props.value);
const text_title = computed(() => {
let text = '';
if (!isEmpty(form.text_title)) {
text = form.text_title;
} else if(!isEmpty(props.sourceList[form.data_source_id])) {
text = props.sourceList[form.data_source_id];
} else if(!props.isPercentage){
text = '请在此输入文字';
}
return text;
});
const text_style = computed(() => {
let style = `font-size: ${ form.text_size }px;color: ${ form.text_color }; text-align: ${ form.text_location }; transform: rotate(${form.text_rotate}deg);text-decoration: ${ form.text_option };${ padding_computer(form.text_padding) };`;
if (form.text_weight == 'italic') {
style += `font-style: italic`;
} else if (form.text_weight == '500') {
style += `font-weight: 500`;
}
return style;
});
const com_style = computed(() => { const com_style = computed(() => {
let style = `${ set_count() } background-color: ${ form.com_bg }; ${ radius_computer(form.bg_radius) }`; let style = `${ set_count() } background-color: ${ form.com_bg }; ${ radius_computer(form.bg_radius) }`;
if (form.border_show == '1') { if (form.border_show == '1') {
style += `border: ${form.border_size}px ${form.border_style} ${form.border_color};`; style += `border: ${form.border_size}px ${form.border_style} ${form.border_color};`;
} }
// return style;
if (form.is_rich_text == '1' && form.is_up_down == '1') { });
style += `overflow-y: auto;`
const icon_style = computed(() => {
let style = `transform: rotate(${form.icon_rotate}deg);${ padding_computer(form.icon_padding) };`;
if (form.icon_location == 'center') {
style += `justify-content: center;`;
} else if (form.icon_location == 'left') {
style += `justify-content: flex-start;`;
} else if (form.icon_location == 'right') {
style += `justify-content: flex-end;`;
} }
return style; return style;
}); });
@ -76,15 +57,4 @@ const set_count = () => {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.break{
word-wrap: break-word;
word-break:break-all;
}
.rich-text-content {
white-space: normal;
word-break:break-all;
* {
max-width: 100%;
}
}
</style> </style>

View File

@ -3,39 +3,25 @@
<el-form :model="form" label-width="70"> <el-form :model="form" label-width="70">
<card-container> <card-container>
<div class="mb-12">文本设置</div> <div class="mb-12">文本设置</div>
<el-form-item label="文本内容"> <el-form-item label="选择图标">
<el-input v-model="form.text_title" placeholder="请输入文本内容" type="textarea" clearable :rows="3" @input="text_change('1')"></el-input> <upload v-model:icon-value="form.icon_class" :limit="1" size="50" is-icon type="icon" @update:model-value="icon_change('1')"></upload>
</el-form-item> </el-form-item>
<el-form-item label="数据字段"> <el-form-item label="数据字段">
<el-select v-model="form.data_source_id" value-key="id" clearable filterable placeholder="请选择图片数据字段" size="default" class="flex-1" @change="text_change('2')"> <el-select v-model="form.data_source_id" value-key="id" clearable filterable placeholder="请选择数据字段" size="default" class="flex-1" @change="icon_change('2')">
<el-option v-for="item in options.filter((item) => item.type == 'icon')" :key="item.field" :label="item.name" :value="item.field" /> <el-option v-for="item in options.filter((item) => item.type == 'icon')" :key="item.field" :label="item.name" :value="item.field" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="链接"> <el-form-item label="链接">
<url-value v-model="form.text_link"></url-value> <url-value v-model="form.icon_link"></url-value>
</el-form-item> </el-form-item>
<el-form-item label="文字颜色"> <el-form-item label="图标颜色">
<color-picker v-model="form.text_color" default-color="#FF3F3F"></color-picker> <color-picker v-model="form.icon_color" default-color="#FF3F3F"></color-picker>
</el-form-item> </el-form-item>
<el-form-item label="文字大小"> <el-form-item label="图标大小">
<el-radio-group v-model="form.text_weight"> <slider v-model="form.icon_size" :max="100"></slider>
<el-radio value="500">加粗</el-radio>
<el-radio value="normal">正常</el-radio>
<el-radio value="italic">倾斜</el-radio>
</el-radio-group>
<el-form-item label="字号" label-width="40" class="mb-0 w">
<slider v-model="form.text_size" :max="100"></slider>
</el-form-item>
</el-form-item> </el-form-item>
<el-form-item label="字符选项"> <el-form-item label="图标位置">
<el-radio-group v-model="form.text_option"> <el-radio-group v-model="form.icon_location" is-button>
<el-radio value="none"><span style="text-decoration: none">Aa</span></el-radio>
<el-radio value="underline"><span style="text-decoration: underline">Aa</span></el-radio>
<el-radio value="line-through"><span style="text-decoration: line-through">Aa</span></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="文字位置">
<el-radio-group v-model="form.text_location" is-button>
<el-tooltip content="左对齐" placement="top" effect="light"> <el-tooltip content="左对齐" placement="top" effect="light">
<el-radio-button value="left"><icon name="iconfont icon-left"></icon></el-radio-button> <el-radio-button value="left"><icon name="iconfont icon-left"></icon></el-radio-button>
</el-tooltip> </el-tooltip>
@ -48,10 +34,10 @@
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="内边距"> <el-form-item label="内边距">
<padding :value="form.text_padding" @update:value="padding_change"></padding> <padding :value="form.icon_padding" @update:value="padding_change"></padding>
</el-form-item> </el-form-item>
<el-form-item label="旋转角度"> <el-form-item label="旋转角度">
<slider v-model="form.text_rotate" :max="1000"></slider> <slider v-model="form.icon_rotate" :max="1000"></slider>
</el-form-item> </el-form-item>
<el-form-item label="是否置底"> <el-form-item label="是否置底">
<el-switch v-model="form.bottom_up" active-value="1" inactive-value="0" /> <el-switch v-model="form.bottom_up" active-value="1" inactive-value="0" />
@ -67,7 +53,7 @@
<slider v-model="form.com_height" :max="1000"></slider> <slider v-model="form.com_height" :max="1000"></slider>
</el-form-item> </el-form-item>
<el-form-item label="背景颜色"> <el-form-item label="背景颜色">
<color-picker v-model="form.com_bg" default-color="#FF3F3F"></color-picker> <color-picker v-model="form.com_bg"></color-picker>
</el-form-item> </el-form-item>
<el-form-item label="圆角"> <el-form-item label="圆角">
<radius :value="form.bg_radius" @update:value="bg_radius_change"></radius> <radius :value="form.bg_radius" @update:value="bg_radius_change"></radius>
@ -121,15 +107,15 @@ const form = ref(diy_data.value.com_data);
const center_height = defineModel('height', { type: Number, default: 0 }); const center_height = defineModel('height', { type: Number, default: 0 });
const padding_change = (padding: any) => { const padding_change = (padding: any) => {
form.value.text_padding = Object.assign(form.value.text_padding, pick(padding, ['padding', 'padding_top', 'padding_bottom', 'padding_left', 'padding_right'])); form.value.icon_padding = Object.assign(form.value.icon_padding, pick(padding, ['padding', 'padding_top', 'padding_bottom', 'padding_left', 'padding_right']));
}; };
const bg_radius_change = (radius: any) => { const bg_radius_change = (radius: any) => {
form.value.bg_radius = Object.assign(form.value.bg_radius, pick(radius, ['radius', 'radius_top_left', 'radius_top_right', 'radius_bottom_left', 'radius_bottom_right'])); form.value.bg_radius = Object.assign(form.value.bg_radius, pick(radius, ['radius', 'radius_top_left', 'radius_top_right', 'radius_bottom_left', 'radius_bottom_right']));
}; };
const text_change = (key: string) => { const icon_change = (key: string) => {
if (key == '2') { if (key == '2') {
form.value.text_title = ''; form.value.icon_title = '';
} else { } else {
form.value.data_source_id = ''; form.value.data_source_id = '';
} }

View File

@ -29,7 +29,7 @@
<slider v-model="form.line_size" :min="1" :max="100"></slider> <slider v-model="form.line_size" :min="1" :max="100"></slider>
</el-form-item> </el-form-item>
<el-form-item label="线条颜色"> <el-form-item label="线条颜色">
<color-picker v-model="form.line_color" default-color="#FF3F3F"></color-picker> <color-picker v-model="form.line_color"></color-picker>
</el-form-item> </el-form-item>
<el-form-item label="是否置底"> <el-form-item label="是否置底">
<el-switch v-model="form.bottom_up" active-value="1" inactive-value="0" /> <el-switch v-model="form.bottom_up" active-value="1" inactive-value="0" />

View File

@ -73,7 +73,7 @@
<slider v-model="form.com_height" :max="1000"></slider> <slider v-model="form.com_height" :max="1000"></slider>
</el-form-item> </el-form-item>
<el-form-item label="背景颜色"> <el-form-item label="背景颜色">
<color-picker v-model="form.com_bg" default-color="#FF3F3F"></color-picker> <color-picker v-model="form.com_bg"></color-picker>
</el-form-item> </el-form-item>
<el-form-item label="圆角"> <el-form-item label="圆角">
<radius :value="form.bg_radius" @update:value="bg_radius_change"></radius> <radius :value="form.bg_radius" @update:value="bg_radius_change"></radius>

View File

@ -309,5 +309,7 @@ const slideChange = (swiper: { realIndex: number }) => {
} }
.video-class { .video-class {
max-width: 100%; max-width: 100%;
margin-right: 10px;
margin-left: 10px;
} }
</style> </style>

View File

@ -82,6 +82,44 @@ export const line_com_data = {
bottom_up: '1', bottom_up: '1',
} }
// icon的默认值
export const icon_com_data = {
com_width: 36,
com_height: 36,
staging_height: 36,
icon_class: '',
data_source_id: '',
data_source_list: {},
icon_link: {},
is_rich_icon: '0',
is_up_down: '1',
icon_color: '#000',
icon_weight: 'normal',
icon_size: 12,
icon_option: 'none',
icon_location: 'left',
icon_padding: {
padding: 0,
padding_top: 0,
padding_bottom: 0,
padding_left: 0,
padding_right: 0,
},
icon_rotate: 0,
border_show: '0',
border_color: '#FF5D5D',
border_style: 'solid',
bg_radius: {
radius: 0,
radius_top_left: 0,
radius_top_right: 0,
radius_bottom_left: 0,
radius_bottom_right: 0,
},
border_size: 1,
com_bg: '',
bottom_up: '1',
}
// 判断两个矩形是否有交集或者被包裹 // 判断两个矩形是否有交集或者被包裹
export const isRectangleIntersecting = (rect1: react1, rect2: react1) => { export const isRectangleIntersecting = (rect1: react1, rect2: react1) => {
// 矩形的格式为 { x, y, width, height } // 矩形的格式为 { x, y, width, height }

View File

@ -56,6 +56,9 @@
<template v-else-if="item.key == 'auxiliary-line'"> <template v-else-if="item.key == 'auxiliary-line'">
<model-lines :key="item.id" :value="item.com_data" :source-list="props.sourceList"></model-lines> <model-lines :key="item.id" :value="item.com_data" :source-list="props.sourceList"></model-lines>
</template> </template>
<template v-else-if="item.key == 'icon'">
<model-icon :key="item.id" :value="item.com_data" :source-list="props.sourceList"></model-icon>
</template>
</div> </div>
</Vue3DraggableResizable> </Vue3DraggableResizable>
</DraggableContainer> </DraggableContainer>
@ -82,7 +85,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { cloneDeep, isEmpty } from 'lodash'; import { cloneDeep, isEmpty } from 'lodash';
import { get_math } from '@/utils'; import { get_math } from '@/utils';
import { text_com_data, img_com_data, line_com_data, isRectangleIntersecting } from "./index-default"; import { text_com_data, img_com_data, line_com_data, icon_com_data, isRectangleIntersecting } from "./index-default";
// //
const app = getCurrentInstance(); const app = getCurrentInstance();
//#region //#region
@ -115,6 +118,11 @@ const components = reactive([
name: '线条', name: '线条',
com_data: line_com_data, com_data: line_com_data,
}, },
{
key: 'icon',
name: '图标',
com_data: icon_com_data,
},
], ],
}, },
]); ]);

View File

@ -11,6 +11,9 @@
<template v-else-if="item.key == 'auxiliary-line'"> <template v-else-if="item.key == 'auxiliary-line'">
<model-lines :key="item.com_data" :value="item.com_data" :source-list="form.data_source_content" :is-percentage="true"></model-lines> <model-lines :key="item.com_data" :value="item.com_data" :source-list="form.data_source_content" :is-percentage="true"></model-lines>
</template> </template>
<template v-else-if="item.key == 'icon'">
<model-icon :key="item.com_data" :value="item.com_data" :source-list="form.data_source_content" :is-percentage="true"></model-icon>
</template>
</div> </div>
</div> </div>
</div> </div>

View File

@ -32,6 +32,9 @@
<template v-else-if="diy_data.key == 'auxiliary-line'"> <template v-else-if="diy_data.key == 'auxiliary-line'">
<model-lines-style :key="key" v-model:height="center_height" :value="diy_data"></model-lines-style> <model-lines-style :key="key" v-model:height="center_height" :value="diy_data"></model-lines-style>
</template> </template>
<template v-else-if="diy_data.key == 'icon'">
<model-icon-style :key="key" v-model:height="center_height" :value="diy_data"></model-icon-style>
</template>
<template v-else> <template v-else>
<div class="w h flex align-c bg-f"> <div class="w h flex align-c bg-f">
<no-data></no-data> <no-data></no-data>