CreditCardActivityEntry.vue 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <div class="credit-card-activity-entry">
  3. <el-card>
  4. <template #header><div class="title">信用卡活动入口配置</div></template>
  5. <el-form :model="form" label-width="170px" style="max-width: 780px">
  6. <el-form-item label="展示客群" required>
  7. <el-select
  8. v-model="form.visibleCrowdIds"
  9. multiple
  10. collapse-tags
  11. collapse-tags-tooltip
  12. clearable
  13. placeholder="请选择展示客群,不选代表全部用户展示"
  14. class="field-md"
  15. >
  16. <el-option v-for="item in crowds" :key="item.id" :label="item.name" :value="item.id" />
  17. </el-select>
  18. <div class="form-tip">数据来自人群管理,不选代表全部用户展示(全部展示不包括潜客)</div>
  19. </el-form-item>
  20. <el-form-item label="活动图标">
  21. <el-upload
  22. class="entry-icon-uploader"
  23. :show-file-list="false"
  24. :auto-upload="false"
  25. :on-change="handleIconChange"
  26. accept="image/*"
  27. >
  28. <img v-if="form.icon" :src="form.icon" class="entry-icon-preview" />
  29. <el-icon v-else class="entry-icon-placeholder"><Plus /></el-icon>
  30. </el-upload>
  31. <div class="form-tip">建议尺寸 100 × 100 px,支持 PNG / JPG</div>
  32. </el-form-item>
  33. <el-form-item label="入口名称" required>
  34. <el-input v-model="form.name" placeholder="移动端入口标题" class="field-md" />
  35. </el-form-item>
  36. <el-form-item label="提示文案">
  37. <el-input v-model="form.tip" type="textarea" :rows="3" placeholder="温馨提示:如需查看信用卡活动进度,请点击上方“信用卡活动专区”。" class="field-lg" />
  38. </el-form-item>
  39. <el-form-item label="跳转地址" required>
  40. <el-input v-model="form.link" placeholder="CVP/信用卡权益平台 URL" />
  41. </el-form-item>
  42. <el-form-item label="启用信用卡活动 tab">
  43. <el-switch v-model="form.enableCreditCardTab" active-text="启用" inactive-text="不启用" />
  44. </el-form-item>
  45. <el-form-item label="更新时间">
  46. <span>{{ form.updatedAt }}</span>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button type="primary" @click="save">保存</el-button>
  50. </el-form-item>
  51. </el-form>
  52. </el-card>
  53. </div>
  54. </template>
  55. <script>
  56. import { ElMessage } from 'element-plus'
  57. import { Plus } from '@element-plus/icons-vue'
  58. import activityStore from '@/store/activityStore'
  59. export default {
  60. name: 'CreditCardActivityEntry',
  61. data() {
  62. return {
  63. Plus,
  64. form: { visibleCrowdIds: [], icon: '', enableCreditCardTab: false, ...activityStore.creditCardEntry }
  65. }
  66. },
  67. computed: {
  68. crowds() { return activityStore.activityCrowds }
  69. },
  70. methods: {
  71. handleIconChange(file) {
  72. const reader = new FileReader()
  73. reader.onload = (e) => { this.form.icon = e.target.result }
  74. reader.readAsDataURL(file.raw)
  75. },
  76. save() {
  77. if (!this.form.name) return ElMessage.warning('入口名称必填')
  78. if (!this.form.link) return ElMessage.warning('跳转地址必填')
  79. activityStore.updateCreditCardEntry(this.form)
  80. this.form = { ...activityStore.creditCardEntry }
  81. ElMessage.success('保存成功')
  82. }
  83. }
  84. }
  85. </script>
  86. <style scoped>
  87. .title { font-weight: 600; }
  88. .form-tip { margin-top:4px; color:#909399; font-size:12px; line-height:1.4; }
  89. .field-md { width:240px; max-width:100%; }
  90. .field-lg { width:360px; max-width:100%; }
  91. .entry-icon-uploader :deep(.el-upload) { border:1px dashed #dcdfe6; border-radius:6px; cursor:pointer; width:100px; height:100px; display:flex; align-items:center; justify-content:center; overflow:hidden; background:#fafafa; transition:border-color .2s; }
  92. .entry-icon-uploader :deep(.el-upload:hover) { border-color:#409eff; }
  93. .entry-icon-preview { width:100%; height:100%; object-fit:cover; }
  94. .entry-icon-placeholder { font-size:24px; color:#909399; }
  95. </style>