CarousalDialog.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <template>
  2. <t-dialog
  3. width="70%"
  4. :header="header"
  5. :confirmBtn="confirmBtn"
  6. :closeOnOverlayClick="false"
  7. @close="handleCloseDialog"
  8. @confirm="fetchSaveCarousalData"
  9. >
  10. <t-space direction="vertical" style="width: 100%">
  11. <TForm ref="form" :data="carousalData" :rules="rules" resetType="initial" label-width="100">
  12. <TFormItem label="轮播图:" name="imageUrl">
  13. <ImageUpload @on-success="handleSuccessImg" :image-url="imgUrl"/>
  14. </TFormItem>
  15. <TFormItem label="跳转类型:" name="targetType" >
  16. <t-radio-group :default-value="carousalData.targetType" v-model="carousalData.targetType">
  17. <t-radio-button v-for="(item,index) in typeOption" :key="index" :value="item.value">{{item.label}}</t-radio-button>
  18. </t-radio-group>
  19. </TFormItem>
  20. <TFormItem label="跳转文章路径:" name="targetId" v-if="carousalData.targetType === 'article' ">
  21. <t-input v-model.trim="carousalData.targetId" clearable placeholder="请输入文章id" />
  22. </TFormItem>
  23. <TFormItem label="跳转网址路径:" name="targetUrl" v-else-if="carousalData.targetType === 'url' ">
  24. <t-input v-model.trim="carousalData.targetUrl" clearable placeholder="请输入网址路径" />
  25. </TFormItem>
  26. </TForm>
  27. </t-space>
  28. </t-dialog>
  29. </template>
  30. <script lang="ts" setup>
  31. import { computed, ref, reactive, watch } from 'vue'
  32. import type { FormInstanceFunctions, FormProps } from 'tdesign-vue-next'
  33. import ImageUpload from '@/components/ImageUpload.vue'
  34. import { createCarousal, updateCarousalItem } from '@/api/carousal'
  35. const props = defineProps<{
  36. isEdit?: Boolean | null
  37. headerTitle?: String | null
  38. carousal: {} | number
  39. }>()
  40. const emit = defineEmits(['success'])
  41. const form = ref<FormInstanceFunctions | null>(null)
  42. const header = computed(() => `${props.isEdit ? '编辑' : '创建'}${props.headerTitle || ''}`)
  43. const formType = computed(() => `${props.isEdit ? 'update' : 'add'}`)
  44. const confirmBtn = computed(() => (props.isEdit ? '保存' : '确定'))
  45. const carousalData: FormProps['data'] = ref({})
  46. const imgUrl = ref({})
  47. const rules = computed(() => {
  48. const commonRules = {
  49. imageUrl: [
  50. {
  51. required: true,
  52. message: '轮播图必须是上传',
  53. type: 'error',
  54. trigger: 'change',
  55. },
  56. ],
  57. targetType: [
  58. {
  59. required: true,
  60. message: '请选择跳转类型',
  61. type: 'error',
  62. trigger: 'blur',
  63. },
  64. {
  65. required: true,
  66. message: '请选择跳转类型',
  67. type: 'error',
  68. trigger: 'change',
  69. },
  70. ],
  71. };
  72. return carousalData.value.targetType === 'article'
  73. ? {...commonRules, targetId: [{ required: true, message: '文章 id 不能为空', type: 'error', trigger: 'blur' }, { required: true, message: '文章 id 不能为空', type: 'error', trigger: 'change' }, { whitespace: true, message: '网址路径不能为空' }] }
  74. : {...commonRules, targetUrl: [{ required: true, message: '网址路径不能为空', type: 'error', trigger: 'blur' }, { required: true, message: '网址路径不能为空', type: 'error', trigger: 'change' }, { whitespace: true, message: '网址路径不能为空' }] };
  75. });
  76. const handleSuccessImg = (res:string) => {
  77. console.log(res,'图片地址')
  78. carousalData.value.imageUrl = res
  79. }
  80. const typeOption = reactive([
  81. { value: 'article', label: '文章' },
  82. { value: 'url', label: '地址' },
  83. ])
  84. const handleFormTypeData = () => {
  85. if (carousalData.value.targetType === 'article') {
  86. delete carousalData.value.targetUrl
  87. } else if (carousalData.value.targetType === 'url') {
  88. delete carousalData.value.targetId
  89. }
  90. }
  91. watch(
  92. () => props.carousal,
  93. (newClassify) => {
  94. carousalData.value = Object.assign({}, newClassify)
  95. const carousalObj = Object.assign({},newClassify)
  96. // imgUrl.value.url = carousalObj.imageUrl || ''
  97. imgUrl.value = { url: carousalObj.imageUrl || '' }
  98. },
  99. {
  100. deep: true,
  101. immediate: true
  102. },
  103. )
  104. const fetchSaveCarousalData = async () => {
  105. /* TODO: 保存分类数据 */
  106. if (form.value) {
  107. const valid = await form.value.validate()
  108. // console.log(valid,'valid')
  109. if (valid && typeof valid === 'boolean') {
  110. /* TODO: 校验通过保存分类数据 */
  111. handleFormTypeData()
  112. // console.log(formType.value,'formType')
  113. let res
  114. switch (formType.value){
  115. case 'create':
  116. res = await createCarousal(carousalData.value)
  117. emit('success')
  118. break;
  119. case 'update':
  120. const fieldsToKeep = ["imageUrl", "targetType", "targetUrl", "targetId"];
  121. const requestObj = {};
  122. for (const field of fieldsToKeep) {
  123. if (carousalData.value[field]!== null && carousalData.value[field]!== undefined) {
  124. requestObj[field] = carousalData.value[field];
  125. }
  126. }
  127. handleFormTypeData()
  128. res = await updateCarousalItem(carousalData.value.id,requestObj)
  129. emit('success')
  130. break;
  131. default:
  132. res = await createCarousal(carousalData.value)
  133. emit('success')
  134. break;
  135. }
  136. // const createCarousalApi = createCarousal(carousalData.value)
  137. // console.log(createCarousalApi,'createCarousalApi')
  138. return
  139. }
  140. }
  141. }
  142. const handleCloseDialog = () => {
  143. // 数据&&规则校验结果重置
  144. if (form.value) {
  145. form.value.reset()
  146. form.value.clearValidate()
  147. }
  148. }
  149. </script>