260 lines
6.5 KiB
Vue
260 lines
6.5 KiB
Vue
<template>
|
|
<view>
|
|
<Header>{{ title }}</Header>
|
|
<view class="create-address">
|
|
<view class="list noBorder">
|
|
<view class="list-main">
|
|
<view class="list-label w-158">
|
|
收货地址
|
|
</view>
|
|
<view
|
|
class="list-content"
|
|
@click="openAddressSelect"
|
|
>
|
|
<template v-if="form.address.cityId">
|
|
{{ form.address.province }} {{ form.address.city }} {{ form.address.district }}
|
|
</template>
|
|
<template v-else>
|
|
<span class="choose">
|
|
点击选择
|
|
<uv-icon name="arrow-right" />
|
|
</span>
|
|
</template>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="list">
|
|
<view class="list-main">
|
|
<view class="list-label w-158">
|
|
详细地址
|
|
</view>
|
|
<view class="list-content">
|
|
<input
|
|
type="text"
|
|
placeholder="请输入详细地址"
|
|
v-model="form.detail"
|
|
/>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="list">
|
|
<view class="list-main">
|
|
<view class="list-label w-158">
|
|
姓名
|
|
</view>
|
|
<view class="list-content">
|
|
<input
|
|
type="text"
|
|
placeholder="请输入姓名"
|
|
v-model="form.realName"
|
|
/>
|
|
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="list">
|
|
<view class="list-main">
|
|
<view class="list-label w-158">
|
|
电话
|
|
</view>
|
|
<view class="list-content">
|
|
<input
|
|
type="tel"
|
|
placeholder="请输入电话"
|
|
maxlength="11"
|
|
v-model="form.phone"
|
|
/>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<view class="form-checkbox">
|
|
<uv-checkbox-group v-model="defaultAddress">
|
|
<uv-checkbox
|
|
shape="circle"
|
|
label="设为默认地址"
|
|
name="isDefault"
|
|
labelColor="#999999"
|
|
activeColor="#EE6D46"
|
|
/>
|
|
</uv-checkbox-group>
|
|
</view>
|
|
<view class="form-buttons">
|
|
<uv-button
|
|
type="primary"
|
|
text="提交"
|
|
customStyle="margin-top: 10px"
|
|
@click="submit"
|
|
/>
|
|
</view>
|
|
<AddressSelect
|
|
ref="addressSelectRef"
|
|
@confirm="addressSelectConfirm" />
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed, onMounted, ref, unref, } from 'vue'
|
|
import { onLoad } from '@dcloudio/uni-app'
|
|
import { getAddressAddAndEdit } from '@/api/address'
|
|
import { useRouter } from "@/hooks/useRouter";
|
|
import Header from "@/components/Header/index.vue";
|
|
import UvCheckboxGroup from "@/uni_modules/uv-checkbox/components/uv-checkbox-group/uv-checkbox-group.vue";
|
|
import UvCheckbox from "@/uni_modules/uv-checkbox/components/uv-checkbox/uv-checkbox.vue";
|
|
import UvButton from "@/uni_modules/uv-button/components/uv-button/uv-button.vue";
|
|
import UvIcon from "@/uni_modules/uv-icon/components/uv-icon/uv-icon.vue";
|
|
import AddressSelect from '@/components/AddressSelect/index.vue'
|
|
import { useInterface } from "@/hooks/useInterface";
|
|
import { checkPhone } from "@/utils/utils";
|
|
|
|
// ========================== hooks ================================================
|
|
const {toast} = useInterface();
|
|
const {getParams, push, goBack} = useRouter()
|
|
|
|
const title = computed(() => form.value.id ? '编辑地址' : '添加地址')
|
|
const defaultAddress = ref([]) // 是否为默认地址 ['isDefault']默认 []非默认
|
|
const actionType = ref(undefined) // 是否是选择地址
|
|
|
|
// =========================== 表单相关 ==========================================
|
|
// 表单
|
|
const form = ref({
|
|
id: undefined,
|
|
realName: undefined,
|
|
phone: undefined,
|
|
detail: undefined,
|
|
isDefault: undefined,
|
|
address: {
|
|
cityId: undefined,
|
|
city: undefined,
|
|
district: undefined,
|
|
province: undefined,
|
|
}
|
|
});
|
|
|
|
/**
|
|
* 校验表单
|
|
* @param form
|
|
* @return {boolean}
|
|
*/
|
|
function checkForm(form) {
|
|
if (!form.address?.cityId) {
|
|
toast?.({title: "请选择收货地址"})
|
|
return false
|
|
}
|
|
if (!form.detail) {
|
|
toast?.({title: "请输入详细地址"})
|
|
return false
|
|
}
|
|
if (!form.realName) {
|
|
toast?.({title: "请输入姓名"})
|
|
return false
|
|
}
|
|
if (!checkPhone(form.phone)) {
|
|
toast?.({title: "请输入正确手机号"})
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
const submitLoading = ref(false) // 是否正在提交
|
|
|
|
/**
|
|
* 提交表单
|
|
* @return {Promise<void>}
|
|
*/
|
|
async function submit() {
|
|
if (!checkForm(form.value) || submitLoading.value) return
|
|
try {
|
|
submitLoading.value = true
|
|
await getAddressAddAndEdit({
|
|
...form.value,
|
|
postCode: undefined,
|
|
isDefault: defaultAddress.value.length > 0 ? 1 : 0,
|
|
})
|
|
toast?.({title: '保存成功'})
|
|
goBack()
|
|
} finally {
|
|
submitLoading.value = false
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 设置编辑表单
|
|
* @param addressItem
|
|
*/
|
|
function setFormDefault(addressItem) {
|
|
form.value.id = addressItem.id
|
|
form.value = {
|
|
...form.value,
|
|
...addressItem,
|
|
address: {
|
|
cityId: addressItem.cityId,
|
|
city: addressItem.city,
|
|
district: addressItem.district,
|
|
province: addressItem.province,
|
|
}
|
|
}
|
|
// 默认地址
|
|
if (addressItem.isDefault) {
|
|
defaultAddress.value = ['isDefault']
|
|
}
|
|
}
|
|
|
|
// ================================= 地址选择相关 ==================================
|
|
const addressSelectRef = ref()
|
|
|
|
/**
|
|
* 打开选择地址
|
|
*/
|
|
function openAddressSelect() {
|
|
const {address} = unref(form)
|
|
let defaultAddressStr = ''
|
|
if (address.province && address.city && address.district) {
|
|
defaultAddressStr = `${ address.province }-${ address.city }-${ address.district }`
|
|
}
|
|
unref(addressSelectRef).open(defaultAddressStr)
|
|
}
|
|
|
|
/**
|
|
* 地址选择confirm
|
|
* @param areaList 地区 [省, 市, 区]
|
|
*/
|
|
function addressSelectConfirm(areaList) {
|
|
if (areaList.length < 3) return
|
|
const {address} = unref(form)
|
|
address.province = areaList[0]?.name
|
|
address.city = areaList[1]?.name
|
|
address.cityId = areaList[2]?.id
|
|
address.district = areaList[2]?.name
|
|
}
|
|
|
|
onLoad(async (options) => {
|
|
const params = getParams?.(options)
|
|
actionType.value = params?.type
|
|
if (params?.address) {
|
|
setFormDefault(params?.address)
|
|
}
|
|
})
|
|
onMounted(() => {
|
|
})
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.create-address {
|
|
background: #fff;
|
|
}
|
|
|
|
.form-checkbox {
|
|
padding-left: 35rpx;
|
|
}
|
|
|
|
.w-158 {
|
|
flex: 0 0 158rpx;
|
|
}
|
|
|
|
.choose {
|
|
@include useFlex(space-between, center);
|
|
color: #808080;
|
|
}
|
|
</style>
|