2025-12-02 14:37:25 +08:00

227 lines
5.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container" :style="appThemeStyle">
<!-- 标题 -->
<view class="page-title">收货地址</view>
<!-- 表单组件 -->
<view class="form-wrapper">
<u-form :model="form" ref="uForm" label-width="140rpx">
<u-form-item label="姓名" prop="buyerName">
<u-input v-model="form.buyerName" placeholder="请输入收货人姓名" />
</u-form-item>
<u-form-item label="电话" prop="buyerPhone">
<u-input v-model="form.buyerPhone" placeholder="请输入收货人手机号" />
</u-form-item>
<u-form-item label="地区" prop="region">
<select-region ref="sRegion" v-model="form.region" />
</u-form-item>
<u-form-item label="详细地址" prop="detail" :border-bottom="false">
<u-input v-model="form.detail" placeholder="街道门牌、楼层等信息" />
</u-form-item>
</u-form>
</view>
<!-- 操作按钮 -->
<view class="footer">
<view class="btn-wrapper">
<!-- #ifdef MP-WEIXIN -->
<view class="btn-item btn-item-wechat" @click="chooseAddress()">选择微信收货地址</view>
<!-- #endif -->
<view class="btn-item btn-item-main" :class="{ disabled }" @click="handleSubmit()">保存</view>
</view>
</view>
</view>
</template>
<script>
import SelectRegion from '@/components/select-region/select-region'
import { isMobile } from '@/utils/verify'
import * as AddressApi from '@/api/address'
import * as OrderApi from '@/api/order'
// 表单验证规则
const rules = {
buyerName: [{
required: true,
message: '请输入姓名',
trigger: ['blur', 'change']
}],
buyerPhone: [{
required: true,
message: '请输入手机号',
trigger: ['blur', 'change']
}, {
// 自定义验证函数
validator: (rule, value, callback) => {
// 返回true表示校验通过返回false表示不通过
return isMobile(value)
},
message: '手机号码不正确',
// 触发器可以同时用blur和change
trigger: ['blur'],
}],
region: [{
required: true,
message: '请选择省市区',
trigger: ['blur', 'change'],
type: 'array'
}],
detail: [{
required: true,
message: '请输入详细地址',
trigger: ['blur', 'change']
}],
}
export default {
components: {
SelectRegion
},
data() {
return {
form: {
buyerName: '',
buyerPhone: '',
region: [],
detail: ''
},
rules,
isLoading: true,
disabled: false
}
},
onLoad({ data }) {
data = JSON.parse(decodeURIComponent(data))
this.createFormData(data)
},
onReady() {
this.$refs.uForm.setRules(this.rules) // 必须要在onReady生命周期因为onLoad生命周期组件可能尚未创建完毕
},
methods: {
// 选择微信地址
// #ifdef MP-WEIXIN
chooseAddress() {
const { form, $refs } = this
uni.chooseAddress({
success(res) {
const names = $refs.sRegion.getOptionItemByNames(res)
form.buyerName = res.userName
form.buyerPhone = res.telNumber
form.detail = res.detailInfo
form.region = names.length > 0 ? names : []
},
fail({ errMsg }) {
app.$toast(errMsg)
console.error('获取微信地址失败:', errMsg)
}
})
},
// #endif
// 生成默认的表单数据
createFormData(detail) {
const { form } = this
form.buyerName = detail.buyerName
form.buyerPhone = detail.buyerPhone
form.detail = detail.detail
form.region = this.createRegion(detail)
},
// 格式化地区数据 (用于select-region组件)
createRegion(detail) {
return [{
label: detail.province,
value: NaN
}, {
label: detail.city,
value: NaN
}, {
label: detail.district,
value: NaN
}]
},
// 表单提交
handleSubmit() {
const app = this
if (app.disabled) {
return false
}
app.$refs.uForm.validate(valid => {
if (valid) {
app.disabled = true
const data = { ...app.form }
data.province = data.region[0].label
data.city = data.region[1].label
data.district = data.region[2].label
OrderApi.apiInsertOrUpdateAddress(data)
.then(result => {
app.$toast(result.msg)
uni.navigateBack()
})
.finally(() => app.disabled = false)
}
})
}
}
}
</script>
<style>
page {
background: #f7f8fa;
}
</style>
<style lang="scss" scoped>
.page-title {
width: 94%;
margin: 0 auto;
padding-top: 40rpx;
font-size: 28rpx;
color: rgba(69, 90, 100, 0.6);
}
.form-wrapper {
margin: 20rpx auto 20rpx auto;
padding: 0 40rpx;
width: 94%;
box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
border-radius: 16rpx;
background: #fff;
}
// 底部操作栏
.footer {
margin-top: 80rpx;
.btn-wrapper {
height: 100%;
// display: flex;
// align-items: center;
padding: 0 20rpx;
}
.btn-item {
flex: 1;
font-size: 28rpx;
height: 86rpx;
color: #fff;
border-radius: 50rpx;
display: flex;
justify-content: center;
align-items: center;
}
.btn-item-wechat {
background: #0ba90b;
margin-bottom: 26rpx;
}
.btn-item-main {
background: linear-gradient(to right, $main-bg, $main-bg2);
color: $main-text;
// 禁用按钮
&.disabled {
opacity: 0.6;
}
}
}
</style>