property.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <template>
  2. <ComponentContainerProperty v-model="formData.style">
  3. <el-form label-width="80px" :model="formData">
  4. <el-card header="样式设置" class="property-group" shadow="never">
  5. <el-form-item label="样式" prop="type">
  6. <el-radio-group v-model="formData.type">
  7. <el-tooltip class="item" content="默认" placement="bottom">
  8. <el-radio-button value="default">
  9. <Icon icon="system-uicons:carousel" />
  10. </el-radio-button>
  11. </el-tooltip>
  12. <el-tooltip class="item" content="卡片" placement="bottom">
  13. <el-radio-button value="card">
  14. <Icon icon="ic:round-view-carousel" />
  15. </el-radio-button>
  16. </el-tooltip>
  17. </el-radio-group>
  18. </el-form-item>
  19. <el-form-item label="指示器" prop="indicator">
  20. <el-radio-group v-model="formData.indicator">
  21. <el-radio value="dot">小圆点</el-radio>
  22. <el-radio value="number">数字</el-radio>
  23. </el-radio-group>
  24. </el-form-item>
  25. <el-form-item label="是否轮播" prop="autoplay">
  26. <el-switch v-model="formData.autoplay" />
  27. </el-form-item>
  28. <el-form-item label="播放间隔" prop="interval" v-if="formData.autoplay">
  29. <el-slider
  30. v-model="formData.interval"
  31. :max="10"
  32. :min="0.5"
  33. :step="0.5"
  34. show-input
  35. input-size="small"
  36. :show-input-controls="false"
  37. />
  38. <el-text type="info">单位:秒</el-text>
  39. </el-form-item>
  40. </el-card>
  41. <el-card header="内容设置" class="property-group" shadow="never">
  42. <Draggable v-model="formData.items" :empty-item="{ type: 'img' }">
  43. <template #default="{ element }">
  44. <el-form-item label="类型" prop="type" class="m-b-8px!" label-width="40px">
  45. <el-radio-group v-model="element.type">
  46. <el-radio value="img">图片</el-radio>
  47. <el-radio value="video">视频</el-radio>
  48. </el-radio-group>
  49. </el-form-item>
  50. <el-form-item
  51. label="图片"
  52. class="m-b-8px!"
  53. label-width="40px"
  54. v-if="element.type === 'img'"
  55. >
  56. <UploadImg
  57. v-model="element.imgUrl"
  58. draggable="false"
  59. height="80px"
  60. width="100%"
  61. class="min-w-80px"
  62. />
  63. </el-form-item>
  64. <template v-else>
  65. <el-form-item label="封面" class="m-b-8px!" label-width="40px">
  66. <UploadImg
  67. v-model="element.imgUrl"
  68. draggable="false"
  69. height="80px"
  70. width="100%"
  71. class="min-w-80px"
  72. />
  73. </el-form-item>
  74. <el-form-item label="视频" class="m-b-8px!" label-width="40px">
  75. <UploadFile
  76. v-model="element.videoUrl"
  77. :file-type="['mp4']"
  78. :limit="1"
  79. :file-size="100"
  80. class="min-w-80px"
  81. />
  82. </el-form-item>
  83. </template>
  84. <el-form-item label="链接" class="m-b-8px!" label-width="40px">
  85. <AppLinkInput v-model="element.url" />
  86. </el-form-item>
  87. </template>
  88. </Draggable>
  89. </el-card>
  90. </el-form>
  91. </ComponentContainerProperty>
  92. </template>
  93. <script setup lang="ts">
  94. import { CarouselProperty } from './config'
  95. import { usePropertyForm } from '@/components/DiyEditor/util'
  96. // 轮播图属性面板
  97. defineOptions({ name: 'CarouselProperty' })
  98. const props = defineProps<{ modelValue: CarouselProperty }>()
  99. const emit = defineEmits(['update:modelValue'])
  100. const { formData } = usePropertyForm(props.modelValue, emit)
  101. </script>
  102. <style scoped lang="scss"></style>