HomePropsEditor.vue 3.6 KB

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