MerchantStoreFrom.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible" width="70%">
  3. <el-form ref="formRef" v-loading="formLoading" :model="formData" :rules="formRules" label-width="120px"
  4. style="padding: 10px;" :disabled="isDetail">
  5. <el-row>
  6. <el-col :span="12">
  7. <el-form-item label="店铺名" prop="name">
  8. <el-input v-model="formData.name" placeholder="请输入店铺名" />
  9. </el-form-item>
  10. </el-col>
  11. <el-col :span="12">
  12. <el-form-item label="店铺域名" prop="website">
  13. <el-input v-model="formData.website" placeholder="请输入店铺域名" />
  14. </el-form-item>
  15. </el-col>
  16. </el-row>
  17. <el-row>
  18. <el-col :span="24">
  19. <el-form-item label="首页图片">
  20. <UploadImg v-model="formData.logoUrl" :limit="1" :is-show-tip="false" />
  21. </el-form-item>
  22. </el-col>
  23. </el-row>
  24. </el-form>
  25. <template #footer>
  26. <el-button :disabled="formLoading" type="danger" @click="deleteStore">删除</el-button>
  27. <el-button :disabled="formLoading" type="primary" @click="submitForm">保存</el-button>
  28. </template>
  29. </Dialog>
  30. </template>
  31. <script lang="ts" setup>
  32. import { ShopApi } from '@/api/system/sale/shop/index'
  33. import { FormRules } from 'element-plus'
  34. import { useAppStore } from '@/store/modules/app'
  35. const appStore = useAppStore()
  36. const mobile = computed(() => appStore.getMobile)
  37. defineOptions({ name: 'SystemUserForm' })
  38. const { t } = useI18n() // 国际化
  39. const message = useMessage() // 消息弹窗
  40. const dialogVisible = ref(false) // 弹窗的是否展示
  41. const dialogTitle = ref('') // 弹窗的标题
  42. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  43. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  44. const formData = ref({
  45. name: '',
  46. id: undefined,
  47. status: 1,
  48. merchantId: 0,
  49. logoUrl: '',
  50. website:''
  51. })
  52. const formRules = reactive<FormRules>({
  53. name: [{ required: true, message: '店铺名不能为空', trigger: 'blur' }],
  54. logoUrl: [{ required: true, message: '店铺名不能为空', trigger: 'blur' }],
  55. })
  56. const isDetail = ref(false)
  57. const openType = ref('create')
  58. const id = ref(0)
  59. /** 打开弹窗 */
  60. const open = async (type: string, obj: object, merchantId: number) => {
  61. openType.value = type
  62. dialogTitle.value = t('action.' + type)
  63. if (type == "view") {
  64. dialogTitle.value = "查看"
  65. }
  66. // 判断打开状态,如果是view那就只能查看 否则可以编辑
  67. if ('view' == type) {
  68. isDetail.value = true
  69. } else {
  70. isDetail.value = false
  71. }
  72. dialogVisible.value = true
  73. formType.value = type
  74. resetForm()
  75. // 修改时,设置数据
  76. if (obj.id) {
  77. formLoading.value = true
  78. try {
  79. ShopApi.getShop(obj.id).then((res)=>{
  80. formData.value = res
  81. })
  82. }finally {
  83. formLoading.value = false
  84. }
  85. }
  86. formData.value.merchantId = merchantId
  87. formData.value.id = obj.id
  88. }
  89. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  90. const formRef = ref() // 表单 Ref
  91. /** 提交表单 */
  92. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  93. const submitForm = async () => {
  94. // 校验表单
  95. if (!formRef) return
  96. const valid = await formRef.value.validate()
  97. if (!valid) return
  98. // 提交请求
  99. formLoading.value = true
  100. try {
  101. const data = formData.value as unknown as ShopApi.UserVO
  102. if (formType.value === 'create') {
  103. await ShopApi.createShop(data)
  104. message.success(t('common.createSuccess'))
  105. } else {
  106. await ShopApi.updateShop(data)
  107. message.success(t('common.updateSuccess'))
  108. }
  109. dialogVisible.value = false
  110. // 发送操作成功的事件
  111. emit('success')
  112. } finally {
  113. formLoading.value = false
  114. }
  115. }
  116. const deleteStore = async() => {
  117. await message.confirm('是否确认删除'+formData.value.name+'?')
  118. try{
  119. await ShopApi.deleteShop(formData.value.id as number)
  120. }catch{
  121. formLoading.value = false
  122. }
  123. dialogVisible.value = false
  124. message.success('删除成功')
  125. emit('success')
  126. }
  127. /** 重置表单 */
  128. const resetForm = () => {
  129. formData.value = {
  130. name: '',
  131. id: undefined,
  132. status: 1,
  133. merchantId: 0,
  134. logoUrl: ''
  135. }
  136. formRef.value?.resetFields()
  137. }
  138. </script>
  139. <style src="@/styles/PcComponents.css"  lang="scss" scoped></style>