HomePropsEditor.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <div class="home-props-editor">
  3. <a-form :labelCol="{ span: 6 }" size="small">
  4. <a-form-item label="首页标题">
  5. <a-input v-model:value="props.props.title" />
  6. </a-form-item>
  7. <a-form-item label="首页副标题">
  8. <a-input v-model:value="props.props.subTitle" />
  9. </a-form-item>
  10. <a-form-item label="Banner 图 URL">
  11. <IconEditor v-model="props.props.homeBanner" />
  12. </a-form-item>
  13. </a-form>
  14. <a-collapse v-model:activeKey="activeKeys" class="props-collapse">
  15. <a-collapse-panel key="homeButtons" header="首页按钮 (homeButtons)">
  16. <template #extra>
  17. <PlusOutlined @click="addHomeButton" />
  18. </template>
  19. <div v-for="(btn, i) in props.props.homeButtons" :key="i" class="nested-item">
  20. <a-form :labelCol="{ span: 6 }" size="small">
  21. <a-form-item label="标题">
  22. <a-input v-model:value="btn.title" />
  23. </a-form-item>
  24. <a-form-item label="是否显示标题">
  25. <a-checkbox v-model:checked="btn.showTitle" :indeterminate="btn.showTitle === undefined" />
  26. </a-form-item>
  27. <a-form-item label="按钮样式">
  28. <a-select v-model:value="btn.style">
  29. <a-select-option value="text">文本按钮</a-select-option>
  30. <a-select-option value="large-bg">大背景按钮</a-select-option>
  31. </a-select>
  32. </a-form-item>
  33. <a-form-item label="图标 URL">
  34. <IconEditor v-model="btn.icon" />
  35. </a-form-item>
  36. <a-form-item label="按钮尺寸%">
  37. <a-input-number v-model:value="btn.size" :min="1" style="width: 100%" />
  38. </a-form-item>
  39. <a-form-item label="跳转链接">
  40. <LinkPathEditor v-model="btn.link" />
  41. </a-form-item>
  42. <a-popconfirm title="确定要删除这个按钮吗?" @confirm="removeHomeButton(i)">
  43. <a-button type="text" danger size="small" @click.stop="">
  44. <DeleteOutlined title="删除" />
  45. </a-button>
  46. </a-popconfirm>
  47. </a-form>
  48. </div>
  49. </a-collapse-panel>
  50. <a-collapse-panel key="categorys" header="首页栏目">
  51. <NestCategoryEditor v-model:categorys="props.props.categorys" />
  52. </a-collapse-panel>
  53. </a-collapse>
  54. </div>
  55. </template>
  56. <script setup lang="ts">
  57. import { ref } from 'vue';
  58. import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';
  59. import type { IHomeCommonCategoryHomeDefine, IHomeCommonCategoryListTabNestCategoryItemDefine } from '../../CommonCategoryDefine';
  60. import LinkPathEditor from '../components/LinkPathEditor.vue';
  61. import IconEditor from '../components/IconEditor.vue';
  62. import NestCategoryEditor from '../subpart/NestCategoryEditor.vue';
  63. const props = defineProps<{
  64. props: IHomeCommonCategoryHomeDefine['props'];
  65. }>();
  66. const activeKeys = ref<string[]>(['homeButtons', 'categorys']);
  67. function addHomeButton(event: MouseEvent) {
  68. event.stopPropagation();
  69. props.props.homeButtons = props.props.homeButtons || [];
  70. props.props.homeButtons.push({ title: '新按钮', icon: '', style: 'text', link: '', size: 50 });
  71. }
  72. function removeHomeButton(i: number) {
  73. props.props.homeButtons.splice(i, 1);
  74. }
  75. function addCategory() {
  76. props.props.categorys = props.props.categorys || [];
  77. props.props.categorys.push({ text: '新分类', type: '', data: undefined } as unknown as IHomeCommonCategoryListTabNestCategoryItemDefine);
  78. }
  79. function removeCategory(i: number) {
  80. props.props.categorys.splice(i, 1);
  81. }
  82. </script>
  83. <style scoped>
  84. .home-props-editor {
  85. font-size: 12px;
  86. }
  87. .props-collapse {
  88. margin-top: 8px;
  89. }
  90. .nested-item {
  91. margin-bottom: 12px;
  92. padding: 8px;
  93. background: #fafafa;
  94. border-radius: 4px;
  95. }
  96. .category-item :deep(.ant-collapse) {
  97. border: none;
  98. background: transparent;
  99. }
  100. .category-item :deep(.ant-collapse-item) {
  101. border: none;
  102. }
  103. </style>