submit.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <template>
  2. <van-form @submit="onSubmit" style="margin-top: 10px; background: #fff">
  3. <van-cell-group inset>
  4. <van-field
  5. v-model="formData.companyName"
  6. label-align="top"
  7. name="用户名"
  8. label="公司名称"
  9. placeholder="请填写公司名称"
  10. :rules="[{ required: true, message: '请填写公司名称' }]"
  11. />
  12. <van-field
  13. v-model="formData.customerName"
  14. label-align="top"
  15. name="联系人"
  16. label="联系人"
  17. placeholder="请填写姓名"
  18. :rules="[{ required: true, message: '请填写姓名' }]"
  19. />
  20. <van-field
  21. v-model="formData.phone"
  22. label-align="top"
  23. name="联系电话"
  24. label="联系电话"
  25. placeholder="请填写手机号"
  26. :rules="[{ required: true, message: '请填写手机号' }, {
  27. // 自定义校验规则
  28. validator: (value) => {
  29. return /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/.test(value);
  30. },
  31. message: '请输入正确格式的手机号码',
  32. trigger: 'onBlur',
  33. }]"
  34. />
  35. <van-field
  36. v-model="formData.cameraSnCode"
  37. label-align="top"
  38. name="产品SN码"
  39. label="产品SN码"
  40. placeholder="请填写下划线后的数字母组合"
  41. :rules="[{ required: true, message: '请填写密码' }]"
  42. />
  43. <van-field
  44. v-model="formData.faultMsg"
  45. label-align="top"
  46. name="故障描述"
  47. label="故障描述"
  48. rows="2"
  49. autosize
  50. type="textarea"
  51. maxlength="500"
  52. show-word-limit
  53. placeholder="请具体描述故障现象,相关操作等。"
  54. />
  55. <van-field name="uploader" label="文件上传" label-align="top">
  56. <template #input>
  57. <van-uploader v-model="formData.faultImg" :before-read="beforeRead" :after-read="clzpAfterRead" />
  58. </template>
  59. </van-field>
  60. <van-field name="radio" label="送修方式" label-align="top">
  61. <template #input>
  62. <van-radio-group v-model="formData.sendType" direction="horizontal">
  63. <van-radio :name="0">前台送修</van-radio>
  64. <van-radio :name="1">快递寄送</van-radio>
  65. </van-radio-group>
  66. </template>
  67. </van-field>
  68. <van-field
  69. v-if="formData.sendType == 1"
  70. v-model="formData.sendTrackingNum"
  71. label-align="top"
  72. name="快递单号"
  73. label="快递单号"
  74. placeholder="请填写快递单号"
  75. :rules="[{ required: true, message: '请填写快递单号' }]"
  76. />
  77. <van-field name="radio" label="取回方式" label-align="top">
  78. <template #input>
  79. <van-radio-group v-model="formData.getType" direction="horizontal">
  80. <van-radio :name="0">前台送修</van-radio>
  81. <van-radio :name="1">快递寄送</van-radio>
  82. </van-radio-group>
  83. </template>
  84. </van-field>
  85. <van-field
  86. v-if="formData.getType == 1"
  87. v-model="formData.getAddress"
  88. label-align="top"
  89. name="收件地址"
  90. label="收件地址"
  91. placeholder="请填写收件地址"
  92. :rules="[{ required: true, message: '请填写收件地址' }]"
  93. />
  94. <van-field
  95. v-if="formData.getType == 1"
  96. v-model="formData.getAddrName"
  97. label-align="top"
  98. name="收件人"
  99. label="收件人"
  100. placeholder="请填写收件人"
  101. :rules="[{ required: true, message: '请填写收件人' }]"
  102. />
  103. <van-field
  104. v-if="formData.getType == 1"
  105. v-model="formData.getAddrPhone"
  106. label-align="top"
  107. name="收件人电话"
  108. label="收件人电话"
  109. placeholder="请填写收件人电话"
  110. :rules="[{ required: true, message: '请填写收件人电话' }, {
  111. // 自定义校验规则
  112. validator: (value) => {
  113. return /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/.test(value);
  114. },
  115. message: '请输入正确格式的手机号码',
  116. trigger: 'onBlur',
  117. }]"
  118. />
  119. <van-field
  120. v-model="formData.message"
  121. label-align="top"
  122. rows="2"
  123. autosize
  124. label="留言"
  125. type="textarea"
  126. maxlength="500"
  127. placeholder="请输入留言"
  128. show-word-limit
  129. />
  130. </van-cell-group>
  131. <div style="margin: 16px">
  132. <van-button round block color="#00B3EC" type="primary" native-type="submit"> 提交 </van-button>
  133. </div>
  134. </van-form>
  135. </template>
  136. <script lang="ts" setup name="HomeSubmit">
  137. import { computed, reactive, unref } from 'vue';
  138. import { useUserStore } from '/@/store/modules/user';
  139. import { showToast, showSuccessToast } from 'vant';
  140. import axios from 'axios';
  141. // import useAxiosApi from '/@/utils/useAxiosApi';
  142. // import { Toast } from '@nutui/nutui';
  143. import { cameraRepair } from '/@/api';
  144. // import { setLang } from '/@/i18n';
  145. // import { useI18n } from 'vue-i18n';
  146. const emit = defineEmits(['setActive'])
  147. // const { locale } = useI18n();
  148. const userStore = useUserStore();
  149. const wxOpenId = computed(() => {
  150. return userStore.getWxOpenId;
  151. });
  152. const formData = reactive({
  153. companyName: '',
  154. customerName: '',
  155. phone: '',
  156. cameraSnCode: '',
  157. faultMsg: '',
  158. faultImg: <any>[],
  159. sendType: 0,
  160. sendTrackingNum: '',
  161. getAddress: '',
  162. getAddrName: '',
  163. getAddrPhone: '',
  164. getType: 0,
  165. message:'',
  166. wxOpenId: wxOpenId.value,
  167. });
  168. async function onSubmit() {
  169. // return new Promise((resolve) => {
  170. let apiData = {
  171. ...formData,
  172. faultImg:formData.faultImg.map(ele => ele.url)
  173. }
  174. const { response } = await cameraRepair(apiData);
  175. let data = unref(response)
  176. console.log('onSubmit', formData, data);
  177. if(data.code == 200){
  178. showSuccessToast('提交成功')
  179. emit('setActive',1)
  180. }
  181. }
  182. //校验图片的格式
  183. function beforeRead(file) {
  184. if (!/(jpg|jpeg|png|JPG|PNG)/i.test(file.type)) {
  185. showToast('请上传正确格式的图片');
  186. return false;
  187. }
  188. return true;
  189. }
  190. //照片上传事件方法
  191. function clzpAfterRead(file) {
  192. // 上传状态提示开启
  193. file.status = 'uploading';
  194. file.message = '上传中...';
  195. // 创建一个空对象实例
  196. let formData = new FormData();
  197. // 调用append()方法添加数据
  198. formData.append('file', file.file);
  199. axios({
  200. url:'/service/sale/upload/file',
  201. method: 'POST',
  202. data:formData,
  203. headers:{
  204. 'Content-Type': 'multipart/form-data'
  205. }
  206. }).then(res => {
  207. let { data } = res
  208. if (data.code == 200) {
  209. // 上传状态提示关闭
  210. file.url = data.data
  211. file.status = 'done';
  212. showToast('上传成功!');
  213. }
  214. });
  215. }
  216. </script>
  217. <style lang="scss">
  218. .header {
  219. display: flex;
  220. justify-content: center;
  221. align-items: center;
  222. padding: 0 20px;
  223. font-size: 40px;
  224. img {
  225. width: 90px;
  226. height: 90px;
  227. }
  228. }
  229. .intro-header {
  230. margin-top: 20px;
  231. display: flex;
  232. align-items: center;
  233. justify-content: center;
  234. font-size: 16px;
  235. }
  236. .supportList {
  237. margin: 0 16px;
  238. .nut-cell-group__title {
  239. margin-top: 30px;
  240. }
  241. .nut-icon {
  242. color: green;
  243. }
  244. }
  245. .btn-wrap {
  246. margin: 20px;
  247. }
  248. .btn-confirm {
  249. @include main-lang-bg(302px, 82px, '/@/assets/button', 'confirm.png');
  250. }
  251. </style>