fc70eb16创建于 2025年8月11日历史提交
<template>
    <div class="common-content-height">
        <el-form :model="form" label-width="60">
            <template v-if="!isNest">
                <common-content-top :value="form.content_top"></common-content-top>
                <div class="divider-line"></div>
            </template>
            <card-container>
                <div class="mb-12">展示设置</div>
                <el-form-item label="选择风格">
                    <el-radio-group v-model="form.tabs_theme" @change="tabs_theme_change">
                        <el-radio value="0">样式一</el-radio>
                        <el-radio value="2">样式二</el-radio>
                        <el-radio value="3">样式三</el-radio>
                    </el-radio-group>
                </el-form-item>
                <el-form-item v-if="form.tabs_theme == '3'" label="选中图标">
                    <upload v-model="form.tabs_adorn_img" v-model:icon-value="form.tabs_adorn_icon" is-icon :limit="1" size="50"></upload>
                </el-form-item>
                <el-form-item label="对齐方式">
                    <el-radio-group v-model="form.justification" @change="tabs_theme_change">
                        <el-radio value="left">居左</el-radio>
                        <el-radio value="center">居中</el-radio>
                        <el-radio value="right">居右</el-radio>
                    </el-radio-group>
                </el-form-item>
                <el-form-item label="更多按钮">
                    <el-switch v-model="form.show_more" class="mr-10" active-value="1" inactive-value="0" />
                </el-form-item>
                <el-form-item label="滑动置顶">
                    <el-switch v-model="form.tabs_top_up" class="mr-10" active-value="1" inactive-value="0" />
                    <tooltip :content="`1.滑动置顶仅手机端有效${ isNest ? '<br/>2.滑动置顶后通用的圆角不生效' : ''}`"></tooltip>
                </el-form-item>
                <template v-if="isNest">
                    <el-form-item v-if="is_general_safe_distance" label="安全距离">
                        <el-switch v-model="form.is_tabs_safe_distance" class="mr-10" active-value="1" inactive-value="0" />
                        <tooltip content="选项卡是否支持安全距离"></tooltip>
                    </el-form-item>
                    <el-form-item label="轮播背景">
                        <el-switch v-model="form.rotating_background" class="mr-10" active-value="1" inactive-value="0" />
                        <tooltip content="1.关闭的时候,如果没有选项卡背景会使用通用背景.<br/>2.打开的时候,如果没有选项卡背景会使用轮播背景,都没有的时候会使用通用背景"></tooltip>
                    </el-form-item>
                </template>
            </card-container>
            <div class="divider-line"></div>
            <card-container>
                <div class="mb-12">选项卡设置</div>
                <div class="flex-col gap-x-20">
                    <div :class="`card-background box-shadow-sm ptb-25 flex-row gap-16 re align-c ${ form.tabs_active_index == 0 ? 'model-type-index-select' : ''}`" @click="tabs_list_click('home', 0)">
                        <el-icon class="iconfont icon-jinzhi size-16 cursor-move" />
                        <div class="flex-col gap-10 w">
                            <el-form-item label="显示类型" class="w mb-0">
                                <div class="flex-col gap-10 w h">
                                    <el-radio-group v-model="form.home_data.tabs_type">
                                        <el-radio value="0">文本</el-radio>
                                        <el-radio value="1">图片/图标</el-radio>
                                    </el-radio-group>
                                    <template v-if="form.home_data.tabs_type == '1'">
                                        <upload v-model="form.home_data.tabs_img" v-model:icon-value="form.home_data.tabs_icon" is-icon :limit="1" size="50"></upload>
                                    </template>
                                    <template v-else>
                                        <el-input v-model="form.home_data.title" placeholder="请输入标题文字" clearable />
                                    </template>
                                </div>
                            </el-form-item>
                            <sliding-fixed v-model="form.home_data.is_sliding_fixed" @sliding_fixed_change="sliding_fixed_change($event, 0, 'home_data')"></sliding-fixed>
                        </div>
                    </div>
                    <drag :data="form.tabs_list" type="card" model-type="tabs" :model-index="form.tabs_active_index - 1" :space-col="25" @click="tabs_list_click" @remove="remove" @on-sort="on_sort">
                        <template #default="{ row, index }">
                            <div class="flex-col align-c jc-s gap-20 flex-1 w">
                                <el-form-item label="数据类型" class="w mb-0">
                                    <div class="flex-col gap-10 w h">
                                        <el-radio-group v-model="row.tabs_type">
                                            <el-radio value="0">文本</el-radio>
                                            <el-radio value="1">图片/图标</el-radio>
                                        </el-radio-group>
                                        <template v-if="row.tabs_type == '1'">
                                            <upload v-model="row.tabs_img" v-model:icon-value="row.tabs_icon" is-icon :limit="1" size="50"></upload>
                                        </template>
                                        <template v-else>
                                            <el-input v-model="row.title" placeholder="请输入标题文字" clearable />
                                        </template>
                                    </div>
                                </el-form-item>
                                <sliding-fixed v-model="row.is_sliding_fixed" class="mb-0" @sliding_fixed_change="sliding_fixed_change($event, index, 'tabs_list')"></sliding-fixed>
                                <el-form-item label="链接类型" class="w mb-0">
                                    <el-radio-group v-model="row.data_type">
                                        <el-radio v-if="page_link_diy_show" value="0">DIY页面</el-radio>
                                        <el-radio value="1">商品分类</el-radio>
                                    </el-radio-group>
                                </el-form-item>
                                <el-form-item :label="row.data_type == '0' ? 'DIY页面' : '商品分类'" class="w mb-0">
                                    <template v-if="row.data_type == '0'">
                                        <url-value v-model="row.micro_page_list" :type="['diy']"></url-value>
                                    </template>
                                    <template v-else>
                                        <url-value v-model="row.classify" :type="['goods-category']"></url-value>
                                    </template>
                                </el-form-item>
                            </div>
                        </template>
                    </drag>
                    <el-button class="mt-20 mb-20 w" @click="add">+添加</el-button>
                </div>
            </card-container>
        </el-form>
    </div>
</template>
<script setup lang="ts">
import { get_math, tabs_style } from '@/utils';
import { isEmpty } from 'lodash';
import { commonStore } from '@/store';
const common_store = commonStore();

const props = defineProps({
    value: {
        type: Object,
        default: () => {},
    },
    tabStyle: {
        type: Object,
        default: () => ({}),
    },
    isNest: {
        type: Boolean,
        default: false,
    },
});

const state = reactive({
    form: props.value,
    styles: props.tabStyle,
});
const { form, styles } = toRefs(state);
// 判断diy页面是否显示
const page_link_diy_show = computed(() => common_store.common.page_link_list.some(item => item.is_show == '1' && item.type == 'diy' && !isEmpty(item.url)));

onBeforeMount(() => {
    if (form.value.tabs_list.length > 1) {
        form.value.tabs_list.forEach((item: any) => {
            item.is_sliding_fixed = !isEmpty(item.is_sliding_fixed) ? item.is_sliding_fixed : '0';
            item.tabs_img = !isEmpty(item.tabs_img) ? item.tabs_img : [];
            item.tabs_icon = !isEmpty(item.tabs_icon) ? item.tabs_icon : '';
            item.tabs_type = !isEmpty(item.tabs_type) ?  item.tabs_type : '0';
        });
    }
    form.value.home_data.is_sliding_fixed = !isEmpty(form.value.home_data.is_sliding_fixed) ? form.value.home_data.is_sliding_fixed : '0';
});

const add = () => {
    form.value.tabs_list.push({
        id: get_math(),
        tabs_type: '0', 
        tabs_img: [], 
        tabs_icon: '',
        title: '',
        desc: '',
        data_type: '0',
        classify: {},
        micro_page: '',
        micro_page_list: {},
        category_list: {},
    });
    form.value.tabs_active_index = form.value.tabs_list.length;
};
const remove = (index: number) => {
    form.value.tabs_list.splice(index, 1);
    if (form.value.tabs_list.length > index) {
        form.value.tabs_active_index = index + 1;
    } else {
        form.value.tabs_active_index = index;
    }
};
// 选项卡点击事件
const tabs_list_click = (item: any, index: number) => { 
    if (item == 'home') {
        form.value.tabs_active_index = index;
    } else {
        form.value.tabs_active_index = index + 1;
    }
}
// 拖拽更新之后,更新数据
const on_sort = (new_list: nav_group[]) => {
    form.value.tabs_list = new_list;
};
const tabs_theme_change = (val: string | number | boolean | undefined): void => {
    styles.value.tabs_color_checked = tabs_style(styles.value.tabs_color_checked, val);
};
const sliding_fixed_change = (val: string | number | boolean, index: number, type: string) => {
    const home_data_is_sliding_fixed = form.value.home_data.is_sliding_fixed == '1';
    const tabs_list_is_sliding_fixed = form.value.tabs_list.findIndex((item: any, index1: number) => item.is_sliding_fixed == '1' && index != index1);
    // 如果是选中的话,判断是否其他选项卡是否选中,如果有的话,就将其他选项卡设置为0
    if (val == '1' && ( home_data_is_sliding_fixed || tabs_list_is_sliding_fixed != -1)) {
        // 如果是首页的话,直接将选项卡的数据全部设置为0
        if (type == 'home_data') {
            form.value.tabs_list.forEach((item: any) => {
                item.is_sliding_fixed = '0';
            });
        } else {
            // 如果是其他的话,将首页的数据全部设置为0,不符合当前index也设置为0
            form.value.home_data.is_sliding_fixed = '0';
            form.value.tabs_list.forEach((item: any, index1: number) => {
                if (index != index1) {
                    item.is_sliding_fixed = '0';
                }
            });
        }
    }
}
// 选项卡是否设置安全距离
const is_general_safe_distance = computed(() => common_store.is_general_safe_distance);
watchEffect(() => {
    if (!is_general_safe_distance.value) {
        form.value.is_tabs_safe_distance = '0';
    }
});
</script>
<style lang="scss" scoped>
.cursor-move {
    color: #ddd;
    cursor: move;
}
.mb-0 {
    margin-bottom: 0 !important;
}
.card-background {
    background: #fff;
    padding-left: 1.6rem;
    padding-right: 2rem;
}
</style>