PreferredGroup.vue 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <template>
  2. <Dialog title="优选集团内容编辑" v-model="dialogVisible" class="!w-60%">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. label-width="170px"
  7. v-loading="formLoading"
  8. >
  9. <el-form-item label="企业名称" prop="enterpriseId" :rules="[{ required: true, message: '请选择企业', trigger: 'blur'}]">
  10. <el-select-v2
  11. ref="selectRef"
  12. v-model="formData.enterpriseId"
  13. :options="enterpriseList"
  14. placeholder="请输入企业名称进行查找"
  15. filterable
  16. :props="{ label: 'name', value: 'id' }"
  17. @blur="handleChange"
  18. />
  19. </el-form-item>
  20. <el-form-item label="顶部轮播图左上角LOGO" prop="logo">
  21. <UploadImg v-model="formData.logo" height="150px" width="150px" />
  22. </el-form-item>
  23. <el-form-item label="顶部轮播图" prop="carousel" :rules="[{ required: true, message: '请上传企业轮播图', trigger: 'change'}]">
  24. <UploadImgs v-model="formData.carousel" :limit="20" />
  25. </el-form-item>
  26. <el-form-item label="简介标题" prop="introduce.title" :rules="[{ required: true, message: '请输入简介标题', trigger: 'blur'}]">
  27. <el-input v-model="formData.introduce.title" />
  28. </el-form-item>
  29. <el-form-item label="集团简介" prop="introduce.describe" :rules="[{ required: true, message: '请输入简介内容', trigger: 'blur'}]">
  30. <Editor v-model:modelValue="formData.introduce.describe" />
  31. </el-form-item>
  32. <el-form-item label="简介小图" prop="introduce.thumbnail">
  33. <UploadImgs v-model="formData.introduce.thumbnail" :limit="20" />
  34. </el-form-item>
  35. <el-form-item label="简介大图" prop="introduce.bigPicture.url">
  36. <UploadImg v-model="formData.introduce.bigPicture.url" height="150px" width="300px" />
  37. </el-form-item>
  38. <el-form-item label="简介大图高度" prop="introduce.bigPicture.height">
  39. <el-input v-model="formData.introduce.bigPicture.height" />
  40. </el-form-item>
  41. <el-form-item label="品牌介绍" prop="">
  42. <el-button @click="handleEditBrandData" type="primary">
  43. 编 辑{{ formData.brandIntroduce && formData.brandIntroduce.length ? `(${formData.brandIntroduce.length})` : '' }}
  44. </el-button>
  45. </el-form-item>
  46. </el-form>
  47. <template #footer>
  48. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  49. <el-button @click="dialogVisible = false">取 消</el-button>
  50. </template>
  51. </Dialog>
  52. <Dialog title="品牌介绍" v-model="showBrandDialog" class="!w-80%">
  53. <div class="flex items-center justify-between">
  54. <div class="color-orange-400">温馨提示:品牌图片规格为宽368px*高192px</div>
  55. <el-button type="primary" @click="handleAdd"><Icon icon="ep:plus" class="mr-5px" />新 增</el-button>
  56. </div>
  57. <el-table :data="brandData" ref="brandTableRef" :stripe="true" height="60vh">
  58. <el-table-column label="品牌名称" align="center" prop="content">
  59. <template #default="scope">
  60. <el-input type="textarea" :rows="1" v-model="scope.row.content" />
  61. </template>
  62. </el-table-column>
  63. <el-table-column label="品牌图片" align="center" prop="url" width="300">
  64. <template #default="scope">
  65. <UploadImg v-model="scope.row.url" height="150px" width="280px" />
  66. </template>
  67. </el-table-column>
  68. <el-table-column label="品牌简介" align="center" prop="desc">
  69. <template #default="scope">
  70. <el-input type="textarea" :rows="3" v-model="scope.row.desc" />
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="操作" align="center" width="60">
  74. <template #default="scope">
  75. <el-button link type="danger" @click="handleDeleteBrand(scope.$index)">删除</el-button>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. <template #footer>
  80. <el-button @click="handleBrandSubmit" type="primary">确 定</el-button>
  81. <el-button @click="showBrandDialog = false">取 消</el-button>
  82. </template>
  83. </Dialog>
  84. </template>
  85. <script setup>
  86. import { WebContentApi } from '@/api/menduner/system/web'
  87. import { cloneDeep } from 'lodash-es'
  88. /** 页面内容 表单 */
  89. defineOptions({ name: 'WebContentForm' })
  90. defineProps({ enterpriseList: Array })
  91. const { t } = useI18n() // 国际化
  92. const message = useMessage() // 消息弹窗
  93. const editId = ref()
  94. const currentKey = ref('')
  95. const dialogVisible = ref(false) // 弹窗的是否展示
  96. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  97. const formData = ref({
  98. enterpriseId: '',
  99. title: '',
  100. logo: '',
  101. carousel: [],
  102. brandIntroduce: [],
  103. introduce: {
  104. title: '集团简介',
  105. describe: '',
  106. thumbnail: [],
  107. bigPicture: {
  108. height: 115,
  109. url: ''
  110. }
  111. }
  112. })
  113. const showBrandDialog = ref(false)
  114. const formRef = ref() // 表单 Ref
  115. const selectRef = ref()
  116. const handleChange = () => {
  117. formData.value.title = selectRef.value.currentPlaceholder
  118. }
  119. /** 打开弹窗 */
  120. const result = ref({})
  121. const open = async (key, id) => {
  122. currentKey.value = key
  123. resetForm()
  124. dialogVisible.value = true
  125. formLoading.value = true
  126. try {
  127. const data = await WebContentApi.getWebContent(1)
  128. result.value = data
  129. // 编辑
  130. if (id && result.value[key] && Object.keys(result.value[key]).length > 0 && result.value[key][id]) {
  131. formData.value = result.value[key][id]
  132. editId.value = id
  133. formData.value.enterpriseId = id
  134. }
  135. } finally {
  136. formLoading.value = false
  137. }
  138. }
  139. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  140. // 新增品牌项
  141. const brandTableRef = ref(null)
  142. const brandData = ref([])
  143. const handleAdd = () => {
  144. brandData.value.push({ content: '', url: '', desc: '' })
  145. nextTick(() => {
  146. const wrapper = brandTableRef.value?.$el?.querySelector('.el-table__body-wrapper')
  147. if (wrapper) {
  148. const rows = wrapper.querySelectorAll('.el-table__row')
  149. if (rows.length) {
  150. const lastRow = rows[rows.length - 1]
  151. brandTableRef.value.setScrollTop(lastRow.offsetTop + lastRow.offsetHeight - wrapper.offsetHeight)
  152. }
  153. }
  154. })
  155. }
  156. // 品牌编辑
  157. const handleEditBrandData = () => {
  158. brandData.value = formData.value.brandIntroduce && formData.value.brandIntroduce.length ? cloneDeep(formData.value.brandIntroduce) : []
  159. showBrandDialog.value = true
  160. }
  161. // 删除品牌项
  162. const handleDeleteBrand = (index) => {
  163. if (!brandData.value[index]) return
  164. brandData.value.splice(index, 1)
  165. }
  166. const handleBrandSubmit = () => {
  167. if (brandData.value && brandData.value.length) {
  168. const checkValue = brandData.value.every(item => item.content.trim() && item.url && item.desc.trim())
  169. if (!checkValue) return message.warning('请将列表中的项填写完整')
  170. }
  171. formData.value.brandIntroduce = brandData.value || []
  172. showBrandDialog.value = false
  173. }
  174. /** 提交表单 */
  175. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  176. const submitForm = async () => {
  177. // 校验表单
  178. await formRef.value.validate()
  179. result.value[currentKey.value][formData.value.enterpriseId] = formData.value
  180. if (editId.value !== formData.value.enterpriseId) delete result.value[currentKey.value][editId.value]
  181. else delete result.value[currentKey.value][formData.value.enterpriseId].enterpriseId
  182. // 提交请求
  183. formLoading.value = true
  184. try {
  185. await WebContentApi.updateWebContent(result.value)
  186. message.success(t('common.updateSuccess'))
  187. dialogVisible.value = false
  188. // 发送操作成功的事件
  189. emit('success')
  190. } finally {
  191. formLoading.value = false
  192. }
  193. }
  194. /** 重置表单 */
  195. const resetForm = () => {
  196. formData.value = {
  197. enterpriseId: '',
  198. title: '',
  199. logo: '',
  200. carousel: [],
  201. brandIntroduce: [],
  202. introduce: {
  203. title: '集团简介',
  204. describe: '',
  205. thumbnail: [],
  206. bigPicture: {
  207. height: 0,
  208. url: ''
  209. }
  210. }
  211. }
  212. editId.value = ''
  213. }
  214. </script>