modify-address.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <!-- 搜索表单 -->
  2. <template>
  3. <simple-form-modal
  4. title="修改地址"
  5. :items="formItems"
  6. ref="editRef"
  7. :baseUrl="baseUrl"
  8. @success="(data) => emit('success', data)"
  9. :formatData="formatData"
  10. >
  11. <template #areaSelect>
  12. <area-select v-model="formData.proCodes" />
  13. </template>
  14. </simple-form-modal>
  15. </template>
  16. <script setup>
  17. import { reactive, ref, defineEmits, getCurrentInstance } from 'vue';
  18. import SimpleFormModal from '@/components/CommonPage/SimpleFormModal.vue';
  19. import AreaSelect from '@/components/CommonPage/AreaSelect.vue';
  20. import request from '@/utils/request';
  21. const { proxy } = getCurrentInstance();
  22. const emit = defineEmits(['success']);
  23. const formItems = computed(() => {
  24. return [
  25. {
  26. type: 'input',
  27. label: '发件人',
  28. prop: 'sendName',
  29. required: true
  30. },
  31. {
  32. type: 'input',
  33. label: '手机号',
  34. prop: 'sendMobile',
  35. itemProps: {
  36. rules: [
  37. { required: true, message: '请输入手机号', trigger: ['blur'] },
  38. {
  39. pattern: /^1[3-9]\d{9}$/,
  40. message: '请输入正确的手机号',
  41. trigger: ['change']
  42. }
  43. ]
  44. }
  45. },
  46. {
  47. type: 'regions',
  48. label: '省市区',
  49. prop: 'proCodes',
  50. required: true,
  51. props: {
  52. cascaderProps: {
  53. lazy: true,
  54. lazyLoad: loadAreaData,
  55. value: 'id',
  56. label: 'district',
  57. checkStrictly: false
  58. }
  59. }
  60. },
  61. {
  62. type: 'textarea',
  63. label: '详细地址',
  64. prop: 'detailAddress',
  65. required: true
  66. }
  67. ];
  68. });
  69. //默认值
  70. const baseUrl = reactive({
  71. add: '/order/orderInfo/modifyAddress'
  72. });
  73. const formData = ref({
  74. orderId: '',
  75. sendName: '',
  76. sendMobile: '',
  77. provinceId: 0,
  78. cityId: 0,
  79. districtId: 0,
  80. detailAddress: '',
  81. proCodes: []
  82. });
  83. const editRef = ref(null);
  84. const formatData = (data) => {
  85. if (data.proCodes.length > 0) {
  86. data.provinceId = data.proCodes[0];
  87. data.cityId = data.proCodes[1];
  88. data.districtId = data.proCodes[2];
  89. }
  90. return {
  91. ...data,
  92. orderId: formData.value.orderId
  93. };
  94. };
  95. function handleOpen(data) {
  96. if (data && data.orderId) {
  97. formData.value.orderId = data.orderId;
  98. formData.value.sendName = data.sendName;
  99. formData.value.sendMobile = data.sendMobile;
  100. formData.value.detailAddress = data.sendAddress;
  101. formData.value.proCodes = data.sendSsqId ? data.sendSsqId.split('/').map(Number) : [];
  102. console.log(formData.value, 'formData.value');
  103. editRef.value?.handleOpen(formData.value);
  104. }
  105. }
  106. // 加载区域数据
  107. async function loadAreaData(node, resolve) {
  108. const { level, value } = node;
  109. try {
  110. let data = [];
  111. if (level === 0) {
  112. // 加载省份数据
  113. data = await getProvinceList();
  114. console.log(data, 'data');
  115. } else if (level === 1) {
  116. // 加载城市数据
  117. data = await getProvinceList(value);
  118. } else if (level === 2) {
  119. // 加载区县数据
  120. data = await getProvinceList(value);
  121. data.forEach((item) => {
  122. item.leaf = true;
  123. });
  124. }
  125. resolve(data);
  126. } catch (error) {
  127. console.error('加载地区数据失败:', error);
  128. resolve([]);
  129. }
  130. }
  131. function getProvinceList(id = 1) {
  132. return new Promise((resolve, reject) => {
  133. request
  134. .get(`/baseinfo/districtInfo/findInfo/${id}`)
  135. .then((res) => {
  136. resolve(res.data.data);
  137. })
  138. .catch((err) => {
  139. resolve([]);
  140. reject(err);
  141. });
  142. });
  143. }
  144. defineExpose({ handleOpen });
  145. </script>