submit.vue 7.7 KB

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