Files
YGChatCS/pages/order/components/UserInfo/index.vue
2025-08-01 11:52:47 +08:00

97 lines
2.5 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="user-info mb12" v-if="hasConsumerData">
<view class="user-info-title">{{ infoTitle }}</view>
<view
v-for="(item, index) in consumerList"
:key="getConsumerKey(item, index)"
class="user-info-group"
>
<view class="user-info-item">
<text class="label">{{ contactLabel }}</text>
<text class="value">{{ item.visitorName || "未填写" }}</text>
</view>
<view class="user-info-item">
<text class="label">联系电话</text>
<text class="value">{{ formatPhone(item.contactPhone) }}</text>
</view>
</view>
</view>
</template>
<script setup>
import { defineProps, computed } from "vue";
// 订单类型常量
const ORDER_TYPES = {
HOTEL: "0", // 酒店订单
TICKET: "1", // 门票订单
DINING: "2", // 餐饮订单
};
// 信息配置映射
const INFO_CONFIG = {
[ORDER_TYPES.HOTEL]: {
title: "订房信息",
contactLabel: "联系房客:",
},
default: {
title: "游客信息",
contactLabel: "联系游客:",
},
};
const props = defineProps({
orderData: {
type: Object,
required: true,
default: () => ({
createTime: "",
consumerInfoList: [],
orderStatus: "0", // 订单状态 0-待支付 1-待确认 2-待使用 3-已取消 4-退款中 5-已关闭 6-已完成
orderType: "0", // 0-酒店订单, 1-门票订单, 2-餐饮
}),
},
});
// 使用计算属性缓存信息标题
const infoTitle = computed(() => {
const config = INFO_CONFIG[props.orderData.orderType] || INFO_CONFIG.default;
return config.title;
});
// 使用计算属性缓存联系人标签
const contactLabel = computed(() => {
const config = INFO_CONFIG[props.orderData.orderType] || INFO_CONFIG.default;
return config.contactLabel;
});
// 使用计算属性处理用户信息列表,提供更好的响应性和缓存
const consumerList = computed(() => {
return props.orderData.consumerInfoList || [];
});
// 检查是否有用户数据
const hasConsumerData = computed(() => {
return consumerList.value.length > 0;
});
// 生成更稳定的key值优先使用唯一标识
const getConsumerKey = (item, index) => {
return item.id || item.visitorName || `consumer-${index}`;
};
// 格式化电话号码显示
const formatPhone = (phone) => {
if (!phone) return "未填写";
// 简单的电话号码格式化,中间部分用*号隐藏
if (phone.length === 11) {
return phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
}
return phone;
};
</script>
<style scoped>
@import "./styles/index.scss";
</style>