This commit is contained in:
YunaiV 2025-01-18 19:21:19 +08:00
commit 34081915d4
36 changed files with 125 additions and 144 deletions

View File

@ -51,7 +51,8 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ComponentStyle, usePropertyForm } from '@/components/DiyEditor/util' import { ComponentStyle } from '@/components/DiyEditor/util'
import { useVModel } from '@vueuse/core'
/** /**
* 组件容器属性目前右边部分 * 组件容器属性目前右边部分
@ -61,7 +62,7 @@ defineOptions({ name: 'ComponentContainer' })
const props = defineProps<{ modelValue: ComponentStyle }>() const props = defineProps<{ modelValue: ComponentStyle }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
const treeData = [ const treeData = [
{ {

View File

@ -93,14 +93,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { CarouselProperty } from './config' import { CarouselProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'CarouselProperty' }) defineOptions({ name: 'CarouselProperty' })
const props = defineProps<{ modelValue: CarouselProperty }>() const props = defineProps<{ modelValue: CarouselProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -73,7 +73,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { CouponCardProperty } from './config' import { CouponCardProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate' import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
import { floatToFixed2 } from '@/utils' import { floatToFixed2 } from '@/utils'
import { PromotionDiscountTypeEnum } from '@/utils/constants' import { PromotionDiscountTypeEnum } from '@/utils/constants'
@ -84,7 +84,7 @@ defineOptions({ name: 'CouponCardProperty' })
const props = defineProps<{ modelValue: CouponCardProperty }>() const props = defineProps<{ modelValue: CouponCardProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const couponList = ref<CouponTemplateApi.CouponTemplateVO[]>([]) const couponList = ref<CouponTemplateApi.CouponTemplateVO[]>([])

View File

@ -45,12 +45,12 @@
<script setup lang="ts"> <script setup lang="ts">
import { DividerProperty } from './config' import { DividerProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'DividerProperty' }) defineOptions({ name: 'DividerProperty' })
const props = defineProps<{ modelValue: DividerProperty }>() const props = defineProps<{ modelValue: DividerProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
//线 //线
const BORDER_TYPES = [ const BORDER_TYPES = [

View File

@ -31,14 +31,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { FloatingActionButtonProperty } from './config' import { FloatingActionButtonProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'FloatingActionButtonProperty' }) defineOptions({ name: 'FloatingActionButtonProperty' })
const props = defineProps<{ modelValue: FloatingActionButtonProperty }>() const props = defineProps<{ modelValue: FloatingActionButtonProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -20,7 +20,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { HotZoneProperty } from '@/components/DiyEditor/components/mobile/HotZone/config' import { HotZoneProperty } from '@/components/DiyEditor/components/mobile/HotZone/config'
import HotZoneEditDialog from './components/HotZoneEditDialog/index.vue' import HotZoneEditDialog from './components/HotZoneEditDialog/index.vue'
@ -29,7 +29,7 @@ defineOptions({ name: 'HotZoneProperty' })
const props = defineProps<{ modelValue: HotZoneProperty }>() const props = defineProps<{ modelValue: HotZoneProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const editDialogRef = ref() const editDialogRef = ref()

View File

@ -21,14 +21,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { ImageBarProperty } from './config' import { ImageBarProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'ImageBarProperty' }) defineOptions({ name: 'ImageBarProperty' })
const props = defineProps<{ modelValue: ImageBarProperty }>() const props = defineProps<{ modelValue: ImageBarProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -56,7 +56,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { MagicCubeProperty } from '@/components/DiyEditor/components/mobile/MagicCube/config' import { MagicCubeProperty } from '@/components/DiyEditor/components/mobile/MagicCube/config'
/** 广告魔方属性面板 */ /** 广告魔方属性面板 */
@ -64,7 +64,7 @@ defineOptions({ name: 'MagicCubeProperty' })
const props = defineProps<{ modelValue: MagicCubeProperty }>() const props = defineProps<{ modelValue: MagicCubeProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const selectedHotAreaIndex = ref(-1) const selectedHotAreaIndex = ref(-1)

View File

@ -48,7 +48,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { import {
EMPTY_MENU_GRID_ITEM_PROPERTY, EMPTY_MENU_GRID_ITEM_PROPERTY,
MenuGridProperty MenuGridProperty
@ -59,7 +59,7 @@ defineOptions({ name: 'MenuGridProperty' })
const props = defineProps<{ modelValue: MenuGridProperty }>() const props = defineProps<{ modelValue: MenuGridProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -28,7 +28,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { import {
EMPTY_MENU_LIST_ITEM_PROPERTY, EMPTY_MENU_LIST_ITEM_PROPERTY,
MenuListProperty MenuListProperty
@ -39,7 +39,7 @@ defineOptions({ name: 'MenuListProperty' })
const props = defineProps<{ modelValue: MenuListProperty }>() const props = defineProps<{ modelValue: MenuListProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -58,7 +58,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { import {
EMPTY_MENU_SWIPER_ITEM_PROPERTY, EMPTY_MENU_SWIPER_ITEM_PROPERTY,
MenuSwiperProperty MenuSwiperProperty
@ -70,7 +70,7 @@ defineOptions({ name: 'MenuSwiperProperty' })
const props = defineProps<{ modelValue: MenuSwiperProperty }>() const props = defineProps<{ modelValue: MenuSwiperProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -64,7 +64,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { NavigationBarCellProperty } from '../config' import { NavigationBarCellProperty } from '../config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'NavigationBarCellProperty' }) defineOptions({ name: 'NavigationBarCellProperty' })

View File

@ -4,7 +4,7 @@
<div v-for="(cell, cellIndex) in cellList" :key="cellIndex" :style="getCellStyle(cell)"> <div v-for="(cell, cellIndex) in cellList" :key="cellIndex" :style="getCellStyle(cell)">
<span v-if="cell.type === 'text'">{{ cell.text }}</span> <span v-if="cell.type === 'text'">{{ cell.text }}</span>
<img v-else-if="cell.type === 'image'" :src="cell.imgUrl" alt="" class="h-full w-full" /> <img v-else-if="cell.type === 'image'" :src="cell.imgUrl" alt="" class="h-full w-full" />
<SearchBar v-else :property="getSearchProp" /> <SearchBar v-else :property="getSearchProp(cell)" />
</div> </div>
</div> </div>
<img <img
@ -51,14 +51,14 @@ const getCellStyle = (cell: NavigationBarCellProperty) => {
} as StyleValue } as StyleValue
} }
// //
const getSearchProp = (cell: NavigationBarCellProperty) => { const getSearchProp = computed(() => (cell: NavigationBarCellProperty) => {
return { return {
height: 30, height: 30,
showScan: false, showScan: false,
placeholder: cell.placeholder, placeholder: cell.placeholder,
borderRadius: cell.borderRadius borderRadius: cell.borderRadius
} as SearchProperty } as SearchProperty
} })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.navigation-bar { .navigation-bar {

View File

@ -66,7 +66,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { NavigationBarProperty } from './config' import { NavigationBarProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import NavigationBarCellProperty from '@/components/DiyEditor/components/mobile/NavigationBar/components/CellProperty.vue' import NavigationBarCellProperty from '@/components/DiyEditor/components/mobile/NavigationBar/components/CellProperty.vue'
// //
defineOptions({ name: 'NavigationBarProperty' }) defineOptions({ name: 'NavigationBarProperty' })
@ -77,7 +77,7 @@ const rules = {
const props = defineProps<{ modelValue: NavigationBarProperty }>() const props = defineProps<{ modelValue: NavigationBarProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
if (!formData.value._local) { if (!formData.value._local) {
formData.value._local = { previewMp: true, previewOther: false } formData.value._local = { previewMp: true, previewOther: false }
} }

View File

@ -30,7 +30,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { NoticeBarProperty } from './config' import { NoticeBarProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'NoticeBarProperty' }) defineOptions({ name: 'NoticeBarProperty' })
// //
@ -40,7 +40,7 @@ const rules = {
const props = defineProps<{ modelValue: NoticeBarProperty }>() const props = defineProps<{ modelValue: NoticeBarProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -20,7 +20,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PageConfigProperty } from './config' import { PageConfigProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'PageConfigProperty' }) defineOptions({ name: 'PageConfigProperty' })
// //
@ -28,7 +28,7 @@ const rules = {}
const props = defineProps<{ modelValue: PageConfigProperty }>() const props = defineProps<{ modelValue: PageConfigProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -25,14 +25,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { PopoverProperty } from './config' import { PopoverProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// 广 // 广
defineOptions({ name: 'PopoverProperty' }) defineOptions({ name: 'PopoverProperty' })
const props = defineProps<{ modelValue: PopoverProperty }>() const props = defineProps<{ modelValue: PopoverProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -135,7 +135,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ProductCardProperty } from './config' import { ProductCardProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import SpuShowcase from '@/views/mall/product/spu/components/SpuShowcase.vue' import SpuShowcase from '@/views/mall/product/spu/components/SpuShowcase.vue'
// //
@ -143,7 +143,7 @@ defineOptions({ name: 'ProductCardProperty' })
const props = defineProps<{ modelValue: ProductCardProperty }>() const props = defineProps<{ modelValue: ProductCardProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -85,7 +85,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ProductListProperty } from './config' import { ProductListProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import SpuShowcase from '@/views/mall/product/spu/components/SpuShowcase.vue' import SpuShowcase from '@/views/mall/product/spu/components/SpuShowcase.vue'
// //
@ -93,7 +93,7 @@ defineOptions({ name: 'ProductListProperty' })
const props = defineProps<{ modelValue: ProductListProperty }>() const props = defineProps<{ modelValue: ProductListProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -25,7 +25,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PromotionArticleProperty } from './config' import { PromotionArticleProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import * as ArticleApi from '@/api/mall/promotion/article/index' import * as ArticleApi from '@/api/mall/promotion/article/index'
// //
@ -33,7 +33,7 @@ defineOptions({ name: 'PromotionArticleProperty' })
const props = defineProps<{ modelValue: PromotionArticleProperty }>() const props = defineProps<{ modelValue: PromotionArticleProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const articles = ref<ArticleApi.ArticleVO>([]) const articles = ref<ArticleApi.ArticleVO>([])

View File

@ -140,7 +140,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PromotionCombinationProperty } from './config' import { PromotionCombinationProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import * as CombinationActivityApi from '@/api/mall/promotion/combination/combinationActivity' import * as CombinationActivityApi from '@/api/mall/promotion/combination/combinationActivity'
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import CombinationShowcase from '@/views/mall/promotion/combination/components/CombinationShowcase.vue' import CombinationShowcase from '@/views/mall/promotion/combination/components/CombinationShowcase.vue'
@ -150,7 +150,7 @@ defineOptions({ name: 'PromotionCombinationProperty' })
const props = defineProps<{ modelValue: PromotionCombinationProperty }>() const props = defineProps<{ modelValue: PromotionCombinationProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const activityList = ref<CombinationActivityApi.CombinationActivityVO[]>([]) const activityList = ref<CombinationActivityApi.CombinationActivityVO[]>([])
onMounted(async () => { onMounted(async () => {

View File

@ -140,7 +140,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { PromotionPointProperty } from './config' import { PromotionPointProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import PointShowcase from '@/views/mall/promotion/point/components/PointShowcase.vue' import PointShowcase from '@/views/mall/promotion/point/components/PointShowcase.vue'
// //
@ -148,7 +148,7 @@ defineOptions({ name: 'PromotionPointProperty' })
const props = defineProps<{ modelValue: PromotionPointProperty }>() const props = defineProps<{ modelValue: PromotionPointProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -140,7 +140,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { PromotionSeckillProperty } from './config' import { PromotionSeckillProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import * as SeckillActivityApi from '@/api/mall/promotion/seckill/seckillActivity' import * as SeckillActivityApi from '@/api/mall/promotion/seckill/seckillActivity'
import { CommonStatusEnum } from '@/utils/constants' import { CommonStatusEnum } from '@/utils/constants'
import SeckillShowcase from '@/views/mall/promotion/seckill/components/SeckillShowcase.vue' import SeckillShowcase from '@/views/mall/promotion/seckill/components/SeckillShowcase.vue'
@ -150,7 +150,7 @@ defineOptions({ name: 'PromotionSeckillProperty' })
const props = defineProps<{ modelValue: PromotionSeckillProperty }>() const props = defineProps<{ modelValue: PromotionSeckillProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const activityList = ref<SeckillActivityApi.SeckillActivityVO[]>([]) const activityList = ref<SeckillActivityApi.SeckillActivityVO[]>([])
onMounted(async () => { onMounted(async () => {

View File

@ -59,7 +59,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { SearchProperty } from '@/components/DiyEditor/components/mobile/SearchBar/config' import { SearchProperty } from '@/components/DiyEditor/components/mobile/SearchBar/config'
/** 搜索框属性面板 */ /** 搜索框属性面板 */
@ -67,7 +67,7 @@ defineOptions({ name: 'SearchProperty' })
const props = defineProps<{ modelValue: SearchProperty }>() const props = defineProps<{ modelValue: SearchProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -80,13 +80,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { TabBarProperty, component, THEME_LIST } from './config' import { TabBarProperty, component, THEME_LIST } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'TabBarProperty' }) defineOptions({ name: 'TabBarProperty' })
const props = defineProps<{ modelValue: TabBarProperty }>() const props = defineProps<{ modelValue: TabBarProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
component.property.items = formData.value.items component.property.items = formData.value.items

View File

@ -101,13 +101,13 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { TitleBarProperty } from './config' import { TitleBarProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'TitleBarProperty' }) defineOptions({ name: 'TitleBarProperty' })
const props = defineProps<{ modelValue: TitleBarProperty }>() const props = defineProps<{ modelValue: TitleBarProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const rules = {} const rules = {}

View File

@ -4,14 +4,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { UserCardProperty } from './config' import { UserCardProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'UserCardProperty' }) defineOptions({ name: 'UserCardProperty' })
const props = defineProps<{ modelValue: UserCardProperty }>() const props = defineProps<{ modelValue: UserCardProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -4,14 +4,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { UserCouponProperty } from './config' import { UserCouponProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'UserCouponProperty' }) defineOptions({ name: 'UserCouponProperty' })
const props = defineProps<{ modelValue: UserCouponProperty }>() const props = defineProps<{ modelValue: UserCouponProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -4,14 +4,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { UserOrderProperty } from './config' import { UserOrderProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'UserOrderProperty' }) defineOptions({ name: 'UserOrderProperty' })
const props = defineProps<{ modelValue: UserOrderProperty }>() const props = defineProps<{ modelValue: UserOrderProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -4,14 +4,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { UserWalletProperty } from './config' import { UserWalletProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'UserWalletProperty' }) defineOptions({ name: 'UserWalletProperty' })
const props = defineProps<{ modelValue: UserWalletProperty }>() const props = defineProps<{ modelValue: UserWalletProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -42,14 +42,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { VideoPlayerProperty } from './config' import { VideoPlayerProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
// //
defineOptions({ name: 'VideoPlayerProperty' }) defineOptions({ name: 'VideoPlayerProperty' })
const props = defineProps<{ modelValue: VideoPlayerProperty }>() const props = defineProps<{ modelValue: VideoPlayerProperty }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
</script> </script>
<style scoped lang="scss"></style> <style scoped lang="scss"></style>

View File

@ -110,7 +110,7 @@
<el-tag <el-tag
v-if="showPageConfig" v-if="showPageConfig"
:effect="selectedComponent?.uid === pageConfigComponent.uid ? 'dark' : 'plain'" :effect="selectedComponent?.uid === pageConfigComponent.uid ? 'dark' : 'plain'"
:type="selectedComponent?.uid === pageConfigComponent.uid ? '' : 'info'" :type="selectedComponent?.uid === pageConfigComponent.uid ? 'primary' : 'info'"
size="large" size="large"
@click="handleComponentSelected(pageConfigComponent)" @click="handleComponentSelected(pageConfigComponent)"
> >
@ -121,7 +121,7 @@
<el-tag <el-tag
v-if="component.position === 'fixed'" v-if="component.position === 'fixed'"
:effect="selectedComponent?.uid === component.uid ? 'dark' : 'plain'" :effect="selectedComponent?.uid === component.uid ? 'dark' : 'plain'"
:type="selectedComponent?.uid === component.uid ? '' : 'info'" :type="selectedComponent?.uid === component.uid ? 'primary' : 'info'"
closable closable
size="large" size="large"
@click="handleComponentSelected(component)" @click="handleComponentSelected(component)"
@ -191,7 +191,7 @@ import { cloneDeep, includes } from 'lodash-es'
import { component as PAGE_CONFIG_COMPONENT } from '@/components/DiyEditor/components/mobile/PageConfig/config' import { component as PAGE_CONFIG_COMPONENT } from '@/components/DiyEditor/components/mobile/PageConfig/config'
import { component as NAVIGATION_BAR_COMPONENT } from './components/mobile/NavigationBar/config' import { component as NAVIGATION_BAR_COMPONENT } from './components/mobile/NavigationBar/config'
import { component as TAB_BAR_COMPONENT } from './components/mobile/TabBar/config' import { component as TAB_BAR_COMPONENT } from './components/mobile/TabBar/config'
import { isString } from '@/utils/is' import { isEmpty, isString } from '@/utils/is'
import { DiyComponent, DiyComponentLibrary, PageConfig } from '@/components/DiyEditor/util' import { DiyComponent, DiyComponentLibrary, PageConfig } from '@/components/DiyEditor/util'
import { componentConfigs } from '@/components/DiyEditor/components/mobile' import { componentConfigs } from '@/components/DiyEditor/components/mobile'
import { array, oneOfType } from 'vue-types' import { array, oneOfType } from 'vue-types'
@ -238,24 +238,42 @@ const props = defineProps({
watch( watch(
() => props.modelValue, () => props.modelValue,
() => { () => {
const modelValue = isString(props.modelValue) const modelValue =
? (JSON.parse(props.modelValue) as PageConfig) isString(props.modelValue) && !isEmpty(props.modelValue)
: props.modelValue ? (JSON.parse(props.modelValue) as PageConfig)
pageConfigComponent.value.property = modelValue?.page || PAGE_CONFIG_COMPONENT.property : props.modelValue
pageConfigComponent.value.property =
(typeof modelValue !== 'string' && modelValue?.page) || PAGE_CONFIG_COMPONENT.property
navigationBarComponent.value.property = navigationBarComponent.value.property =
modelValue?.navigationBar || NAVIGATION_BAR_COMPONENT.property (typeof modelValue !== 'string' && modelValue?.navigationBar) ||
tabBarComponent.value.property = modelValue?.tabBar || TAB_BAR_COMPONENT.property NAVIGATION_BAR_COMPONENT.property
tabBarComponent.value.property =
(typeof modelValue !== 'string' && modelValue?.tabBar) || TAB_BAR_COMPONENT.property
// //
pageComponents.value = (modelValue?.components || []).map((item) => { pageComponents.value = ((typeof modelValue !== 'string' && modelValue?.components) || []).map(
const component = componentConfigs[item.id] (item) => {
return { ...component, property: item.property } const component = componentConfigs[item.id]
}) return { ...component, property: item.property }
}
)
}, },
{ {
immediate: true immediate: true
} }
) )
/** 选择组件修改其属性后更新它的配置 */
watch(
selectedComponent,
(val: any) => {
if (!val || selectedComponentIndex.value === -1) {
return
}
pageComponents.value[selectedComponentIndex.value] = selectedComponent.value!
},
{ deep: true }
)
// //
const handleSave = () => { const handleSave = () => {
// //

View File

@ -1,4 +1,3 @@
import { ref, Ref } from 'vue'
import { PageConfigProperty } from '@/components/DiyEditor/components/mobile/PageConfig/config' import { PageConfigProperty } from '@/components/DiyEditor/components/mobile/PageConfig/config'
import { NavigationBarProperty } from '@/components/DiyEditor/components/mobile/NavigationBar/config' import { NavigationBarProperty } from '@/components/DiyEditor/components/mobile/NavigationBar/config'
import { TabBarProperty } from '@/components/DiyEditor/components/mobile/TabBar/config' import { TabBarProperty } from '@/components/DiyEditor/components/mobile/TabBar/config'
@ -78,34 +77,6 @@ export interface PageConfig {
// 页面组件只保留组件ID组件属性 // 页面组件只保留组件ID组件属性
export interface PageComponent extends Pick<DiyComponent<any>, 'id' | 'property'> {} export interface PageComponent extends Pick<DiyComponent<any>, 'id' | 'property'> {}
// 属性表单监听
export function usePropertyForm<T>(modelValue: T, emit: Function): { formData: Ref<T> } {
const formData = ref<T>()
// 监听属性数据变动
watch(
() => modelValue,
() => {
formData.value = modelValue
},
{
deep: true,
immediate: true
}
)
// 监听表单数据变动
watch(
() => formData.value,
() => {
emit('update:modelValue', formData.value)
},
{
deep: true
}
)
return { formData } as { formData: Ref<T> }
}
// 页面组件库 // 页面组件库
export const PAGE_LIBS = [ export const PAGE_LIBS = [
{ {

View File

@ -13,9 +13,16 @@
class="mb-4px flex flex-col gap-4px border border-gray-2 border-rounded rounded border-solid p-8px" class="mb-4px flex flex-col gap-4px border border-gray-2 border-rounded rounded border-solid p-8px"
> >
<!-- 操作按钮区 --> <!-- 操作按钮区 -->
<div class="m--8px m-b-4px flex flex-row items-center justify-between p-8px" style="background-color: var(--app-content-bg-color);"> <div
class="m--8px m-b-4px flex flex-row items-center justify-between p-8px"
style="background-color: var(--app-content-bg-color)"
>
<el-tooltip content="拖动排序"> <el-tooltip content="拖动排序">
<Icon icon="ic:round-drag-indicator" class="drag-icon cursor-move" style="color: #8a909c;" /> <Icon
icon="ic:round-drag-indicator"
class="drag-icon cursor-move"
style="color: #8a909c"
/>
</el-tooltip> </el-tooltip>
<el-tooltip content="删除"> <el-tooltip content="删除">
<Icon <Icon
@ -47,7 +54,7 @@
<script setup lang="ts"> <script setup lang="ts">
// //
import VueDraggable from 'vuedraggable' import VueDraggable from 'vuedraggable'
import { usePropertyForm } from '@/components/DiyEditor/util' import { useVModel } from '@vueuse/core'
import { any, array } from 'vue-types' import { any, array } from 'vue-types'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
@ -66,7 +73,7 @@ const props = defineProps({
}) })
// //
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit) const formData = useVModel(props, 'modelValue', emit)
// //
const handleAdd = () => formData.value.push(cloneDeep(props.emptyItem || {})) const handleAdd = () => formData.value.push(cloneDeep(props.emptyItem || {}))

View File

@ -1,7 +1,7 @@
<template> <template>
<el-input v-model="valueRef" v-bind="$attrs"> <el-input v-model="modelValue" v-bind="$attrs">
<template #append> <template #append>
<el-color-picker v-model="colorRef" :predefine="PREDEFINE_COLORS" /> <el-color-picker v-model="color" :predefine="PREDEFINE_COLORS" />
</template> </template>
</el-input> </el-input>
</template> </template>
@ -9,6 +9,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import { PREDEFINE_COLORS } from '@/utils/color' import { PREDEFINE_COLORS } from '@/utils/color'
import { useVModels } from '@vueuse/core'
/** /**
* 带颜色选择器输入框 * 带颜色选择器输入框
@ -19,33 +20,8 @@ const props = defineProps({
modelValue: propTypes.string.def('').isRequired, modelValue: propTypes.string.def('').isRequired,
color: propTypes.string.def('').isRequired color: propTypes.string.def('').isRequired
}) })
watch(
() => props.modelValue,
(val: string) => {
if (val === unref(valueRef)) return
valueRef.value = val
}
)
const emit = defineEmits(['update:modelValue', 'update:color']) const emit = defineEmits(['update:modelValue', 'update:color'])
const { modelValue, color } = useVModels(props, emit)
//
const valueRef = ref(props.modelValue)
watch(
() => valueRef.value,
(val: string) => {
emit('update:modelValue', val)
}
)
//
const colorRef = ref(props.color)
watch(
() => colorRef.value,
(val: string) => {
emit('update:color', val)
}
)
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.el-input-group__append) { :deep(.el-input-group__append) {

View File

@ -52,7 +52,9 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formData = ref<DiyTemplateApi.DiyTemplatePropertyVO>() const formData = ref<DiyTemplateApi.DiyTemplatePropertyVO>()
const formRef = ref() // Ref const formRef = ref() // Ref
// //
const currentFormData = ref<DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO>() const currentFormData = ref<DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO>({
property: ''
} as DiyPageApi.DiyPageVO)
// templateItem // templateItem
const currentFormDataMap = ref< const currentFormDataMap = ref<
Map<string, DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO> Map<string, DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO>
@ -92,17 +94,21 @@ const handleTemplateItemChange = (val: number) => {
// //
if (val === 0) { if (val === 0) {
libs.value = templateLibs libs.value = templateLibs
currentFormData.value = isEmpty(data) ? formData.value : data currentFormData.value = (isEmpty(data) ? formData.value : data) as
| DiyTemplateApi.DiyTemplatePropertyVO
| DiyPageApi.DiyPageVO
return return
} }
// //
libs.value = PAGE_LIBS libs.value = PAGE_LIBS
currentFormData.value = isEmpty(data) currentFormData.value = (
? formData.value!.pages.find( isEmpty(data)
(page: DiyPageApi.DiyPageVO) => page.name === templateItems[val].name ? formData.value!.pages.find(
) (page: DiyPageApi.DiyPageVO) => page.name === templateItems[val].name
: data )
: data
) as DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO
} }
// //
@ -170,7 +176,9 @@ const recoverPageIndex = () => {
sessionStorage.removeItem(DIY_PAGE_INDEX_KEY) sessionStorage.removeItem(DIY_PAGE_INDEX_KEY)
// //
currentFormData.value = formData.value currentFormData.value = formData.value as
| DiyTemplateApi.DiyTemplatePropertyVO
| DiyPageApi.DiyPageVO
currentFormDataMap.value = new Map< currentFormDataMap.value = new Map<
string, string,
DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO DiyTemplateApi.DiyTemplatePropertyVO | DiyPageApi.DiyPageVO