mrr.sj.front/pages/search/components/serviceCardList.vue

472 lines
11 KiB
Vue
Raw Normal View History

2026-03-24 11:45:13 +08:00
<template>
<view class="service-list">
<!-- 循环渲染列表项 -->
<view class="service-item-wrapper" v-for="(item, index) in listWithShortTitle" :key="index" @click="goServerDetail(item)">
<!-- 上半部分手艺人/门店信息 -->
<view class="artisan-row" v-if="hasArtisanOrShop(item)">
<!-- 手艺人头像只有有手艺人头像时才显示 -->
<image class="artisan-avatar" v-if="hasArtisanAvatar(item)" :src="getArtisanAvatar(item)" mode="aspectFill"></image>
<view class="artisan-info">
<!-- 手艺人名字 -->
<text class="artisan-name" v-if="hasArtisanName(item)">{{ getArtisanName(item) }}</text>
<!-- 分隔线只有当手艺人名字和门店名字都存在时才显示 -->
<text class="separator" v-if="hasArtisanName(item) && hasShopName(item)"> | </text>
<!-- 门店名字 -->
<text class="shop-name" v-if="hasShopName(item)">{{ getShopName(item) }}</text>
<image class="artisan-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/f49ad42d-3581-4287-9815-35a13ac555bd.png" />
</view>
</view>
<!-- 下半部分原有卡片 -->
<view class="service-item">
<view class="avatar_box">
<view class="tag_kind">{{
item.server_kind == 1 ? "到家" : item.server_kind == 2 ? "到店" : item.server_kind == 2 ? "到店" : item.server_kind == 3 ? "上门\到店" : ""
}}</view>
<image class="avatar" :src="getServiceImage(item)" mode="aspectFill"></image>
</view>
<!-- 右侧信息区 -->
<view class="item-right">
<view class="top-info">
<view class="name-wrapper">
<image class="service-title-type" mode="widthFix" src="@/static/images/shop/pintuan/group2.png"
v-if="item.team_buy && Object.keys(item.team_buy).length != 0"></image>
<text class="name" :style="{width:item.team_buy && Object.keys(item.team_buy).length != 0?`180rpx`:`240rpx`}">{{ item.title }}</text>
</view>
</view>
<!-- 服务标签 -->
<view class="services">
<view class="service-tag">
2026-03-25 13:29:04 +08:00
<view class="price">{{ item.server_price }}</view>
2026-03-24 11:45:13 +08:00
<view class="split"></view>
2026-03-25 13:29:04 +08:00
<view class="server_time">服务时长{{ item.server_time }}分钟</view>
2026-03-24 11:45:13 +08:00
</view>
</view>
<view class="distance">
<image class="position"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/e37b3bd7-841f-4d57-a11a-2365c81f740e" />
<text>{{ formatDistance(item.distance) }}</text>
</view>
<!-- 可预约时间 -->
<view class="time_box">
<view class="time">销量
<text class="num">{{ item.sales_num }}</text>
</view>
<view class="order-btn" >{{ btnText }}</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "ServiceListItem",
props: {
list: {
type: Array,
default: () => [],
},
btnText: {
type: String,
default: "去下单",
}
},
methods: {
// 检查是否有手艺人或门店信息
hasArtisanOrShop(item) {
return this.hasArtisanName(item) || this.hasShopName(item);
},
// 检查是否有手艺人头像
hasArtisanAvatar(item) {
return item.user_syr && item.user_syr.head_photo && item.user_syr.head_photo.trim() !== '';
},
// 获取手艺人头像
getArtisanAvatar(item) {
if (this.hasArtisanAvatar(item)) {
return item.user_syr.head_photo;
}
return "https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40";
},
// 检查是否有手艺人名字
hasArtisanName(item) {
return item.user_syr && item.user_syr.name && item.user_syr.name.trim() !== '';
},
// 获取手艺人名字
getArtisanName(item) {
if (this.hasArtisanName(item)) {
return item.user_syr.name;
}
// 如果没有手艺人名字,检查是否有门店名字作为备选
if (this.hasShopName(item)) {
return item.user_sj.name;
}
return "";
},
// 检查是否有门店名字
hasShopName(item) {
return item.user_sj && item.user_sj.name && item.user_sj.name.trim() !== '';
},
// 获取门店名字
getShopName(item) {
if (this.hasShopName(item)) {
return item.user_sj.name;
}
return "";
},
// 获取服务图片
getServiceImage(item) {
if (item.photo && item.photo.length > 0 && item.photo[0] && item.photo[0].trim() !== '') {
return item.photo[0];
}
// 如果没有图片,返回默认图片
return "https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/default-service.png";
},
// 格式化距离显示
formatDistance(distance) {
if (!distance && distance !== 0) return "距离未知";
// 如果距离小于1公里显示米
if (distance < 1) {
return (distance * 1000).toFixed(0) + "m";
}
// 如果距离大于等于1公里显示公里
return distance.toFixed(2) + "km";
},
formatTimeToRelative(timeStr) {
const [datePart, timePart] = timeStr.split(" ");
const [year, month, day] = datePart.split("-").map(Number);
const [hours, minutes] = timePart.split(":").map(Number);
const inputDate = new Date(year, month - 1, day, hours, minutes);
const today = new Date();
today.setHours(0, 0, 0, 0);
const tomorrow = new Date(today);
tomorrow.setDate(tomorrow.getDate() + 1);
const inputDateOnly = new Date(inputDate);
inputDateOnly.setHours(0, 0, 0, 0);
const timeFormat = `${hours.toString().padStart(2, "0")}:${minutes
.toString()
.padStart(2, "0")}`;
if (inputDateOnly.getTime() === today.getTime()) {
return `${timeFormat}`;
} else if (inputDateOnly.getTime() === tomorrow.getTime()) {
return `${timeFormat}`;
} else {
return timeStr;
}
},
goServerDetail(item) {
if (item.team_buy && Object.keys(item.team_buy).length != 0) {
uni.navigateTo({
url: `/pages/groupBuy/detail?id=${item.id}`,
});
} else {
uni.navigateTo({
url: `/pages/service/detail?id=${item.id}`
})
}
},
},
computed: {
listWithShortTitle() {
2026-03-25 13:29:04 +08:00
return this.list.map(item => {
return {
...item
};
2026-03-24 11:45:13 +08:00
});
},
},
};
</script>
<style lang="less" scoped>
.service-item-wrapper {
display: flex;
flex-direction: column;
background-color: #fff;
border-radius: 20rpx;
padding: 20rpx;
}
/* 手艺人信息行 */
.artisan-row {
display: flex;
align-items: center;
padding: 10rpx 20rpx;
margin-top: 10rpx;
width: 100%;
}
.artisan-avatar {
width: 40rpx;
height: 40rpx;
border-radius: 50%;
margin-right: 16rpx;
flex-shrink: 0;
}
.artisan-info {
display: flex;
align-items: center;
flex: 1;
min-width: 0;
}
.artisan-name {
font-size: 28rpx;
font-weight: 500;
color: #333333;
flex-shrink: 0;
}
.separator {
font-size: 24rpx;
color: #dddddd;
margin: 0 8rpx;
flex-shrink: 0;
}
.shop-name {
font-size: 26rpx;
color: #666666;
flex: 0 1 auto;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin: 0;
}
.artisan-icon {
width: 8rpx;
height: 14rpx;
flex-shrink: 0;
flex: 0 0 auto;
margin-left: 8rpx;
}
/* 列表容器 */
.service-list {
padding: 20rpx 20rpx 0rpx 20rpx;
display: flex;
flex-direction: column;
gap: 20rpx;
/* #ifdef MP-WEIXIN */
transform: scale(1.13);
/* #endif */
}
/* 单个列表项 */
.service-item {
position: relative;
display: flex;
align-items: flex-start;
padding: 10rpx 20rpx 20rpx 20rpx;
background-color: transparent;
border-radius: 0;
}
.avatar_box {
width: 218rpx;
height: 218rpx;
background: #935858;
border-radius: 12rpx;
overflow: hidden;
margin-right: 30rpx;
position: relative;
flex-shrink: 0;
.tag_kind {
position: absolute;
left: 0;
top: 0;
z-index: 100;
text-align: center;
padding: 0 8rpx;
height: 38rpx;
line-height: 38rpx;
2026-06-02 11:39:23 +08:00
background: linear-gradient(124deg, #f52540 0%, #FF4767 100%);
2026-03-24 11:45:13 +08:00
border-radius: 12rpx 2rpx 12rpx 2rpx;
font-size: 22rpx;
color: #ffffff;
}
}
/* 头像样式 */
.avatar {
width: 218rpx;
height: 218rpx;
}
/* 右侧信息容器 */
.item-right {
flex: 1;
width: 100%;
display: flex;
flex-direction: column;
/* 使用space-between让底部内容对齐 */
justify-content: space-between;
/* 设置最小高度与左侧图片相同 */
min-height: 218rpx;
}
/* 姓名 + 距离 行 */
.top-info {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 7rpx;
gap: 20rpx; // 减小间距
overflow: hidden;
}
.name-wrapper {
flex: 1; // 占据剩余空间
display: flex;
align-items: center;
min-width: 0;
max-width: 100%;
overflow: hidden;
gap: 8rpx;
}
.name {
font-family: PingFangSC, PingFang SC;
font-weight: 500;
line-height: 34rpx;
font-size: 28rpx;
color: #333333;
flex: 1; // 占据剩余空间
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
// white-space: nowrap; // 确保单行显示
display: block;
width: 100%;
margin-bottom: 10rpx;
}
.distance {
display: flex;
align-items: center;
line-height: 33rpx;
gap: 6rpx;
font-family: DINPro, DINPro;
font-weight: 400;
font-size: 24rpx;
color: #666666;
flex-shrink: 0;
2026-03-25 13:29:04 +08:00
margin-top: 8rpx;
2026-03-24 11:45:13 +08:00
}
.position {
width: 19rpx;
height: 21rpx;
}
/* 服务标签容器 */
.services {
display: flex;
gap: 10rpx 0;
flex-wrap: wrap;
// margin-bottom: 26rpx;
}
.service-tag {
font-size: 26rpx;
color: #666666;
display: flex;
align-items: center;
.price {
font-weight: 700;
font-size: 26rpx;
2026-06-02 11:39:23 +08:00
color: #FF4767;
2026-03-24 11:45:13 +08:00
font-family: DINPro, DINPro;
}
.server_time {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
font-size: 26rpx;
color: #666666;
line-height: 34rpx;
text-align: left;
font-style: normal;
}
.split {
width: 2rpx;
height: 20rpx;
background: #666666;
margin: 0 10rpx;
}
}
.time_box {
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-end;
padding-bottom: 0;
margin-top: auto;
}
/* 可预约时间 */
.time {
font-size: 26rpx;
color: #999999;
.num {
font-family: DINPro, DINPro;
font-weight: 400;
font-size: 28rpx;
color: #999999;
}
}
/* 下单按钮 */
.order-btn {
line-height: 60rpx;
height: 60rpx;
padding: 0rpx 20rpx;
2026-06-02 11:39:23 +08:00
background: linear-gradient(107deg, #f84c63 0%, #FF4767 100%);
2026-03-24 11:45:13 +08:00
border-radius: 30rpx;
text-align: center;
color: #fff;
font-size: 25rpx;
/* 修改:确保按钮与底部对齐 */
align-self: flex-end;
}
.service-title-type {
width: 56rpx;
height: 28rpx; // 添加固定高度,保持图片比例
flex-shrink: 0; // 防止图片被压缩
display: block; // 确保图片正确显示
}
</style>