merchant_settled.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <template>
  2. <div class="w-full bg-page">
  3. <div class="main-container" v-loading="loading">
  4. <el-breadcrumb class="my-[20px] !leading-[18px]" :separator-icon="ArrowRight">
  5. <el-breadcrumb-item>
  6. <span class="cursor-pointer text-[#333]" @click="router.push('/')">首页</span>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <span class="text-[#666]">商户入驻申请</span>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <div class="bg-[#fff] pt-[50px] pb-[20px] px-[170px] relative rounded-[var(--rounded-big)]">
  13. <div>
  14. <div class="absolute top-[30px] right-[20px] text-[14px] text-primary cursor-pointer" @click="router.push({ path: '/member/merchant_record'})">
  15. <span class="iconfont icon-jishibenV6xx !text-[14px]"></span>
  16. <span>申请记录</span>
  17. </div>
  18. <div class="text-[24px] text-[#333] mb-[50px] text-center leading-[32px]">入驻申请</div>
  19. <el-form :model="formData" label-width="120px" ref="formRef" size="large" :rules="formRules" class="page-form" >
  20. <el-form-item :label="t('siteName')" prop="site_name">
  21. <el-input v-model.trim="formData.site_name" clearable :placeholder="t('siteNamePlaceholder')" maxlength="20" />
  22. </el-form-item>
  23. <el-form-item :label="t('userName')" prop="user_name">
  24. <el-input v-model.trim="formData.user_name" clearable :placeholder="t('userNamePlaceholder')" maxlength="25"/>
  25. </el-form-item>
  26. <el-form-item :label="t('mobile')" prop="user_mobile">
  27. <el-input v-model.trim="formData.user_mobile" clearable :placeholder="t('mobilePlaceholder')"/>
  28. </el-form-item>
  29. <el-form-item :label="t('shopCategory')" prop="category_id">
  30. <el-select class="w-full" v-model="formData.category_id" clearable :placeholder="t('shopCategoryPlaceholder')">
  31. <el-option v-for="(item, index) in shopCategoryList" :key="index" :label="item.category_name" :value="item.category_id"/>
  32. </el-select>
  33. </el-form-item >
  34. <el-form-item :label="t('siteGroup')" prop="group_id">
  35. <el-select class="w-full" v-model="formData.group_id" clearable :placeholder="t('siteGroupPlaceholder')">
  36. <el-option v-for="(item, index) in siteGroupList" :key="index" :label="item.group_name" :value="item.group_id"/>
  37. </el-select>
  38. </el-form-item >
  39. <el-form-item :label="t('businessLicense')" prop="business_license">
  40. <div>
  41. <div class="text-[12px] text-[#666] leading-[40px]">请上传营业执照及行业相关资质证明图片</div>
  42. <div class="text-[12px] text-[#999] mb-[20px] leading-[12px]">{{t('businessLicenseTips')}}</div>
  43. <upload-file v-model="formData.business_license" :limit="5" width="138px" height="138px" ></upload-file>
  44. </div>
  45. </el-form-item>
  46. <el-form-item label="" prop="agree">
  47. <div class="text-[14px] flex items-center leading-[40px]">
  48. <el-checkbox v-model="formData.agree"/>
  49. <span>{{ t('agree') }}</span>
  50. <span class="text-[var(--el-color-primary)] cursor-pointer" @click="toLink">{{ t('enterApply') }}</span>
  51. </div>
  52. </el-form-item>
  53. <el-form-item label="">
  54. <el-button type="primary" round class="!text-[#fff] oppoSans-M" @click="confirm(formRef)">{{ t('save') }}</el-button>
  55. </el-form-item>
  56. </el-form>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </template>
  62. <script setup lang="ts">
  63. import { ref, reactive, computed } from 'vue'
  64. import { getShopCategory, getSiteGroup, setShopApply,getShopApply, editShopApply} from '@/addon/mall/api/merchant'
  65. import { useRouter,useRoute } from 'vue-router'
  66. import { ArrowRight } from '@element-plus/icons-vue'
  67. const router = useRouter()
  68. const route = useRoute()
  69. const loading = ref(false)
  70. /**
  71. * 表单数据
  72. */
  73. const initialFormData = {
  74. apply_id: '',
  75. site_name: '',
  76. user_name: '',
  77. user_mobile: '',
  78. category_id: '',
  79. group_id:'',
  80. business_license:'',
  81. agree: false,
  82. refuse_reason:''
  83. }
  84. const formData = reactive({ ...initialFormData })
  85. const formRef = ref(null)
  86. // 表单验证规则
  87. const formRules = computed(() => {
  88. return {
  89. site_name: [
  90. { required: true, message: t('siteNamePlaceholder'), trigger: 'blur' }
  91. ],
  92. user_name: [
  93. { required: true, message: t('userNamePlaceholder'), trigger: 'blur' }
  94. ],
  95. user_mobile: [
  96. { required: true, message: t('mobilePlaceholder'), trigger: 'blur' },
  97. { required: true, validator: validatePhone, trigger: 'blur' }
  98. ],
  99. category_id: [
  100. { required: true, message: t('shopCategoryPlaceholder'), trigger: 'blur' }
  101. ],
  102. group_id: [
  103. { required: true, message: t('siteGroupPlaceholder'), trigger: 'blur' }
  104. ],
  105. business_license: [
  106. { required: true, message: t('businessLicensePlaceholder'), trigger: 'blur' }
  107. ]
  108. }
  109. })
  110. // 验证手机号格式
  111. const validatePhone = (rule, value, callback) => {
  112. const phonePattern = /^1[3456789]\d{9}$/
  113. if (!value) {
  114. return callback(new Error(t('请输入手机号')))
  115. } else if (!phonePattern.test(value)) {
  116. return callback(new Error(t('请输入正确的手机号')))
  117. } else {
  118. return callback()
  119. }
  120. }
  121. // 店铺分类
  122. const shopCategoryList = ref([])
  123. const getShopCategoryFn = () =>{
  124. getShopCategory().then(res =>{
  125. shopCategoryList.value = res.data
  126. })
  127. }
  128. getShopCategoryFn()
  129. // 店铺套餐
  130. const siteGroupList = ref([])
  131. const getSiteGroupFn = () =>{
  132. getSiteGroup().then(res =>{
  133. siteGroupList.value = res.data
  134. })
  135. }
  136. getSiteGroupFn()
  137. // 店铺申请详情
  138. const getShopApplyFn = (id) =>{
  139. loading.value = true
  140. getShopApply(id).then(res=>{
  141. const data = res.data
  142. if(JSON.stringify(data) != '[]'){
  143. Object.keys(formData).forEach(key =>{
  144. if(data[key] != undefined) formData[key] = data[key]
  145. })
  146. }
  147. loading.value = false
  148. }).catch(() =>{
  149. loading.value = false
  150. })
  151. }
  152. if(route.query.apply_id){
  153. getShopApplyFn(route.query.apply_id)
  154. }
  155. // 提交申请
  156. const confirm = async (formEl) => {
  157. if (loading.value || !formEl) return
  158. await formEl.validate(async (valid) => {
  159. if (valid) {
  160. if(!formData.agree){
  161. ElMessage.error('请勾选并同意入驻协议')
  162. return
  163. }
  164. loading.value = true
  165. const api = formData.apply_id ? editShopApply : setShopApply
  166. api(formData).then(res => {
  167. loading.value = false
  168. for(let key in formData){
  169. if(formData[key] != undefined && key == 'agree') formData[key] = false
  170. formData[key] = ''
  171. }
  172. router.push({ path: '/member/merchant_record' })
  173. }).catch(() => {
  174. loading.value = false
  175. router.push({ path: '/member/merchant_record' })
  176. })
  177. }
  178. })
  179. }
  180. const toLink = () =>{
  181. const url = router.resolve({
  182. path: '/auth/agreement',
  183. query: { key: 'shop_apply' }
  184. })
  185. window.open(url.href)
  186. }
  187. </script>
  188. <style lang="scss" scoped>
  189. :deep(.el-checkbox){
  190. margin-right: 7px;
  191. }
  192. </style>