You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

280 lines
8.9 KiB

<template>
<el-header>
<Header />
</el-header>
<div class="delivery-container">
<el-row class="send-container">
<el-row class="panel send-panel send-panel1">
<el-row class="send-container">
<el-button class="send-btn"></el-button>
<el-row>
<el-button @click="openAddressBook">簿</el-button>
<el-button>智能填写</el-button>
</el-row>
</el-row>
<el-form ref="senderFormRef" label-width="auto" class="form" :model="form.sender" :rules="rules.sender">
<el-form-item label="姓名" prop="senderName">
<el-input v-model="form.sender.senderName" placeholder="请填写发件人姓名"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="senderPhone">
<el-input v-model="form.sender.senderPhone" placeholder="请填写发件人联系电话"></el-input>
</el-form-item>
<el-form-item label="省市区" prop="senderProvince">
<el-cascader
:options="options"
v-model="form.sender.senderProvince"
:props="{ value: 'value', label: 'label', children: 'children' }"
placeholder="请选择省市区"
/>
</el-form-item>
<el-form-item label="详细地址" prop="senderAddress">
<el-input v-model="form.sender.senderAddress" placeholder="请填写详细地址"></el-input>
</el-form-item>
<el-form-item label="公司名称" prop="senderCompany" class="no-asterisk">
<el-input v-model="form.sender.senderCompany" placeholder="请填写公司名称"></el-input>
</el-form-item>
</el-form>
</el-row>
<el-image src="src/assets/arrow.png"></el-image>
<el-row class="panel send-panel send-panel1">
<el-row class="send-container">
<el-button class="send-btn receiver-btn">收</el-button>
<el-row>
<el-button @click="openAddressBook">地址簿</el-button>
<el-button>智能填写</el-button>
</el-row>
</el-row>
<el-form ref="receiverFormRef" label-width="auto" class="form" :model="form.receiver" :rules="rules.receiver">
<el-form-item label="姓名" prop="receiverName">
<el-input v-model="form.receiver.receiverName" placeholder="请填写收件人姓名"></el-input>
</el-form-item>
<el-form-item label="联系电话" prop="receiverPhone">
<el-input v-model="form.receiver.receiverPhone" placeholder="请填写收件人联系电话"></el-input>
</el-form-item>
<el-form-item label="省市区" prop="receiverProvince">
<el-cascader
:options="options"
v-model="form.receiver.receiverProvince"
:props="{ value: 'value', label: 'label', children: 'children' }"
placeholder="请选择省市区"
/>
</el-form-item>
<el-form-item label="详细地址" prop="receiverAddress">
<el-input v-model="form.receiver.receiverAddress" placeholder="请填写详细地址"></el-input>
</el-form-item>
<el-form-item label="公司名称" prop="receiverCompany" class="no-asterisk">
<el-input v-model="form.receiver.receiverCompany" placeholder="请填写公司名称"></el-input>
</el-form-item>
</el-form>
</el-row>
<el-row class="panel send-panel">
<el-text class="end-label">寄件方式</el-text>
<el-radio-group v-model="sendType">
<el-radio :value="0" size="large">预约上门取件</el-radio>
<el-radio :value="1" size="large">自行联系快递员</el-radio>
</el-radio-group>
</el-row>
<el-row class="panel send-panel">
<el-button class="confirm-btn" @click="submitForm"></el-button>
</el-row>
</el-row>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router'; // 引入路由相关的函数
import addressList from '../../assets/addressList.js';
import { ElMessage } from 'element-plus';
import { deliveryAPI } from '@/api';
import type { DeliveryForm } from '@/types/api';
const formatCityData = (arr) => {
return arr.map(item => ({
value: item.name,
label: item.name,
children: item.sub && item.sub.length > 0 ? formatCityData(item.sub) : []
}));
};
const options = ref(formatCityData(addressList));
const sendType = ref(0);
// 创建路由实例
const router = useRouter();
const form = ref<DeliveryForm>({
sender: {
name: '',
phone: '',
province: [],
address: '',
company: ''
},
receiver: {
name: '',
phone: '',
province: [],
address: '',
company: ''
},
sendType: 0
});
const rules = ref({
receiver: {
receiverName: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
],
receiverPhone: [
{ required: true, message: '请输入联系电话', trigger: 'blur' }
],
receiverProvince: [
{ required: true, message: '请输入省市区', trigger: 'blur' }
],
receiverAddress: [
{ required: true, message: '请输入详细地址', trigger: 'blur' }
],
receiverCompany: [
{ required: false, message: '请输入公司名称', trigger: 'blur' }
],
},
sender: {
senderName: [
{ required: true, message: '请输入姓名', trigger: 'blur' }
],
senderPhone: [
{ required: true, message: '请输入联系电话', trigger: 'blur' }
],
senderProvince: [
{ required: true, message: '请输入省市区', trigger: 'blur' }
],
senderAddress: [
{ required: true, message: '请输入详细地址', trigger: 'blur' }
],
senderCompany: [
{ required: false, message: '请输入公司名称', trigger: 'blur' }
],
}
});
const senderFormRef = ref(null);
const receiverFormRef = ref(null);
// 打开地址簿
const openAddressBook = async () => {
try {
const response = await deliveryAPI.getAddressBook();
// 处理地址簿数据...
router.push({ name: 'address' });
} catch (error) {
ElMessage.error('获取地址簿失败');
}
};
// 提交表单
const submitForm = async () => {
if (senderFormRef.value && receiverFormRef.value) {
const validSender = await senderFormRef.value.validate();
const validReceiver = await receiverFormRef.value.validate();
if (validSender && validReceiver) {
try {
await deliveryAPI.submitDelivery(form.value);
ElMessage.success('下单成功!');
} catch (error) {
ElMessage.error('下单失败,请稍后重试');
}
}
}
};
</script>
<style>
.delivery-container {
padding: 20px;
margin: 20px;
background-color: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0,0,0,0.1);
}
.send-container {
display: flex;
width: 70%;
flex-direction: row;
justify-content: space-between;
margin-top: 10px;
align-items: center;
margin-left: auto;
margin-right: auto; /* 添加这一行 */
}
/* 卡片容器样式 */
.panel {
background-color: #f9f9f9; /* 淡雅的背景颜色 */
border-radius: 8px; /* 圆角边框 */
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
padding: 30px;
margin-top: 30px;
margin-bottom: 20px;
width: calc(50% - 20px); /* 设置宽度为容器宽度的一半减去间距 */
}
/* 调整第二个卡片的样式 */
.send-panel1 {
width: calc(50% - 20px); /* 设置宽度为容器宽度的一半减去间距 */
align-items: center;
}
/* 按钮样式 */
.send-btn {
background-color: #333; /* 深灰色背景 */
color: white;
border-radius: 50%;
padding: 10px;
margin-right: 10px; /* 添加右边距 */
}
.receiver-btn {
background-color: #d9534f; /* 红色背景 */
}
/* 表单样式 */
.form {
margin-top: 10px;
width: 70%; /* 表单宽度调整为100% */
}
/* 确认按钮样式 */
.confirm-btn {
background-color: #428bca; /* 蓝色背景 */
color: white;
padding: 10px 20px; /* 添加内边距 */
border: none; /* 去除边框 */
border-radius: 5px; /* 圆角边框 */
margin-top: 5px;
margin-bottom: 5px;
cursor: pointer; /* 鼠标悬停时显示指针 */
}
/* 标签样式 */
.el-form-item__label {
color: #333; /* 标签文字颜色 */
font-weight: 500; /* 字体加粗 */
}
.end-label {
font-weight: 600;
align-self: flex-start;
margin-right: 40px;
margin-top: 10px;
}
.el-form-item__label::before {
content: '*';
color: red;
margin-right: 4px;
}
.el-form-item.no-asterisk .el-form-item__label::before {
content: none;
}
</style>