|
|
@@ -0,0 +1,206 @@
|
|
|
+<template>
|
|
|
+ <div class="edit-address">
|
|
|
+ <a-page-header
|
|
|
+ style="padding: 0;margin-bottom: 10px;"
|
|
|
+ title="返回"
|
|
|
+ @back="emits('prev-step')"
|
|
|
+ />
|
|
|
+ <a-form
|
|
|
+ name="mainFormRef"
|
|
|
+ :model="mainForm"
|
|
|
+ :label-col="{ style: {width: '100px'}}"
|
|
|
+ @finish="onFinish"
|
|
|
+ >
|
|
|
+ <a-form-item
|
|
|
+ label="联系人"
|
|
|
+ name="name"
|
|
|
+ :rules="[{ required: true, message: '不能为空' }]"
|
|
|
+ >
|
|
|
+ <a-input v-model:value="mainForm.name" placeholder="请输入" allowClear />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item
|
|
|
+ label="手机号码"
|
|
|
+ name="phone"
|
|
|
+ :rules="[{ required: true, validator: checkPhone }]"
|
|
|
+ >
|
|
|
+ <a-input v-model:value="mainForm.phone" placeholder="请输入" allowClear />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item
|
|
|
+ label="所在地区"
|
|
|
+ name="area"
|
|
|
+ :rules="[{ required: true, message: '不能为空' }]"
|
|
|
+ >
|
|
|
+ <a-cascader
|
|
|
+ v-model:value="mainForm.area"
|
|
|
+ :options="mainForm.options"
|
|
|
+ :load-data="loadData"
|
|
|
+ placeholder="请选择"
|
|
|
+ change-on-select
|
|
|
+ :fieldNames="{
|
|
|
+ label: 'name',
|
|
|
+ value: 'name',
|
|
|
+ children: 'children'
|
|
|
+ }"
|
|
|
+ @focus="loadFirstLevelRegin"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item
|
|
|
+ label="详细地址"
|
|
|
+ name="address"
|
|
|
+ :rules="[{ required: true, message: '不能为空' }]"
|
|
|
+ >
|
|
|
+ <a-textarea v-model:value="mainForm.address" placeholder="请输入" allowClear :auto-size="{minRows: 3, maxRows: 5}" />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item
|
|
|
+ label="门牌号"
|
|
|
+ name="houseNo"
|
|
|
+ >
|
|
|
+ <a-input v-model:value="mainForm.houseNo" placeholder="请输入" allowClear />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item
|
|
|
+ label="设为默认"
|
|
|
+ name="defaultAddr"
|
|
|
+ >
|
|
|
+ <a-switch v-model:checked="mainForm.defaultAddr" />
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item label=" " :colon="false">
|
|
|
+ <a-button :disabled="mainForm.disabled" type="primary" html-type="submit" block>提 交</a-button>
|
|
|
+ </a-form-item>
|
|
|
+ </a-form>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="js">
|
|
|
+import { reactive, onMounted } from 'vue';
|
|
|
+import { message } from 'ant-design-vue';
|
|
|
+import { addAddress, updateAddress, getAddressDetail, queryRegion } from '@/api/user';
|
|
|
+import { validPhone } from '@/utils/validate';
|
|
|
+import { useUserStore } from '@/store/user';
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ addressId: {
|
|
|
+ type: String,
|
|
|
+ default: ''
|
|
|
+ },
|
|
|
+ type: {
|
|
|
+ type: String,
|
|
|
+ default: 'add'
|
|
|
+ }
|
|
|
+})
|
|
|
+const emits = defineEmits(['prev-step', 'add', 'update']);
|
|
|
+
|
|
|
+const userStore = useUserStore();
|
|
|
+
|
|
|
+const mainForm = reactive({
|
|
|
+ name: undefined,
|
|
|
+ phone: undefined,
|
|
|
+ area: undefined,
|
|
|
+ address: undefined,
|
|
|
+ houseNo: undefined,
|
|
|
+ defaultAddr: false,
|
|
|
+ disabled: false,
|
|
|
+ options: []
|
|
|
+})
|
|
|
+
|
|
|
+const onFinish = () => {
|
|
|
+ mainForm.disabled = true
|
|
|
+ const [
|
|
|
+ province,
|
|
|
+ city,
|
|
|
+ area,
|
|
|
+ street
|
|
|
+ ] = mainForm.area;
|
|
|
+ const params = {
|
|
|
+ province,
|
|
|
+ city,
|
|
|
+ area,
|
|
|
+ street,
|
|
|
+ name: mainForm.name,
|
|
|
+ phone: mainForm.phone,
|
|
|
+ address: mainForm.address,
|
|
|
+ houseNo: mainForm.houseNo,
|
|
|
+ defaultAddr: mainForm.defaultAddr,
|
|
|
+ userId: userStore.userInfo?.userId || ''
|
|
|
+ }
|
|
|
+ if (props.type !== 'add') {
|
|
|
+ params.userAddressId = props.addressId
|
|
|
+ updateAddress(params).then(() => {
|
|
|
+ message.success('修改成功')
|
|
|
+ emits('add')
|
|
|
+ emits('prev-step')
|
|
|
+ }).finally(() => {
|
|
|
+ mainForm.disabled = false
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ addAddress(params).then(() => {
|
|
|
+ message.success('提交成功')
|
|
|
+ emits('update')
|
|
|
+ emits('prev-step')
|
|
|
+ }).finally(() => {
|
|
|
+ mainForm.disabled = false
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const fetchDetail = async () => {
|
|
|
+ const res = await getAddressDetail({
|
|
|
+ userAddressId: props.addressId
|
|
|
+ })
|
|
|
+ mainForm.name = res.data?.name
|
|
|
+ mainForm.phone = res.data?.phone
|
|
|
+ mainForm.address = res.data?.address
|
|
|
+ mainForm.houseNo = res.data?.houseNo
|
|
|
+ mainForm.defaultAddr = res.data?.defaultAddr
|
|
|
+ mainForm.area = [res.data?.province, res.data?.city, res.data?.area, res.data?.street]
|
|
|
+}
|
|
|
+
|
|
|
+const fetchReginData = (parentId = '') => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ queryRegion({parentId}).then(res => resolve(res)).catch(() => {
|
|
|
+ reject()
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+const loadFirstLevelRegin = async() => {
|
|
|
+ if (mainForm.options.length === 0) {
|
|
|
+ const res = await fetchReginData('');
|
|
|
+ mainForm.options = (res.data || []).map(item => ({
|
|
|
+ ...item,
|
|
|
+ isLeaf: false
|
|
|
+ }))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const loadData = async (selectedOptions) => {
|
|
|
+ const targetOption = selectedOptions[selectedOptions.length - 1];
|
|
|
+ if (targetOption.level >= 4) {
|
|
|
+ targetOption.loading = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ targetOption.loading = true;
|
|
|
+ const res = await fetchReginData(targetOption.id).finally(() => {
|
|
|
+ targetOption.loading = false;
|
|
|
+ })
|
|
|
+ if (res) {
|
|
|
+ targetOption.loading = false;
|
|
|
+ targetOption.children = (res.data || []).map(item => ({
|
|
|
+ ...item,
|
|
|
+ isLeaf: targetOption.level >= 3
|
|
|
+ }))
|
|
|
+ mainForm.options = [...mainForm.options];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const checkPhone= (rule, value) => {
|
|
|
+ if (value === '') return Promise.reject('不能为空')
|
|
|
+ if (validPhone(value) === false) return Promise.reject('手机号码格式有误')
|
|
|
+ return Promise.resolve()
|
|
|
+}
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ if (props.type !== 'add' && props.addressId) {
|
|
|
+ fetchDetail()
|
|
|
+ }
|
|
|
+})
|
|
|
+</script>
|