mrr.sj.front/pages/user/store-detail.vue

1464 lines
38 KiB
Vue
Raw Permalink 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="detail-page">
<custom-navbar title="店铺主页" :show-back="true" backgroundColor="#fff" :show-headle="true"
headleSrc="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/3b04f0c1-a55e-4658-9de5-22175cce9bbc.png"
@onHeadleClick="goInvite"></custom-navbar>
<!-- 手艺人顶部首图 -->
<view class="main-image-section">
<!-- <swiper class="banner-swiper" circular :indicator-dots="false" :autoplay="false" :interval="3000"
:duration="500" indicator-active-color="#fff" indicator-color="rgba(255, 255, 255, 0.6)">
<swiper-item @click="previewImage()">
<video :src="sjdetail.video" v-if="sjdetail.video" id="myVideo" class="banner-image"
:autoplay="true" :controls="false" :muted="true" :loop="true" enable-play-gesture="true"
object-fit="cover">
</video>
<image v-else :src="headPhoto" mode="aspectFill" class="banner-image"
referrer="no-referrer">
</image>
</swiper-item>
</swiper> -->
<view class="banner-swiper">
<video :src="imgVideoList.main_video.url" v-if="imgVideoList.main_video" id="myVideo"
class="banner-image" :autoplay="true" :controls="false" :muted="true" :loop="true"
enable-play-gesture="true" object-fit="cover">
</video>
<image v-else-if="!imgVideoList.main_video && imgVideoList.main_img" :src="imgVideoList.main_img.url"
mode="aspectFill" class="banner-image" referrer="no-referrer">
</image>
<image v-else src="/static/default.png"
mode="aspectFill" class="banner-image" referrer="no-referrer">
</image>
<cover-view class="album flex-row-center" v-if="imgVideoList.main_video || imgVideoList.main_img">
<cover-view class="album-left flex-row-center-center">
{{ imgVideoList.main_video?"视频":"图片" }}
</cover-view>
<cover-view class="album-line">
</cover-view>
<cover-view class="album-right flex-row-center-center" @click="goAlbum">
<cover-view class="album-right-text">
<cover-view>相册</cover-view>
</cover-view>
<cover-image src="/static/images/icons/right7_13.png" class="album-right-img"></cover-image>
</cover-view>
</cover-view>
</view>
</view>
<!-- 手艺人信息卡片 -->
<view class="detail-info">
<view class="detail-info-user">
<view class="detail-info-user__heard">
<image :src="headPhoto" mode="aspectFill" class="detail-info-user__heard__photo"
referrer="no-referrer"></image>
<view class="detail-info-user__heard__name">
<view class="detail-info-user__heard__name__text">
{{ sjdetail.name }}
</view>
<view class="detail-info-user__heard__name__sales" v-if="sjdetail.all_sales_num >= 0">
<text class="detail-info-user__heard__name__sales__text1">
全部销量
</text>
<text class="detail-info-user__heard__name__sales__text2">
{{ sjdetail.all_sales_num }}
</text>
<text class="detail-info-user__heard__name__sales__text1">
</text>
</view>
</view>
<!-- 联系客服按钮 -->
<!-- <view class="contact-customer-btn" @click="contactCustomer">
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/2cee17d5-0603-421a-8956-d698a2e8c7aa.png" class="contact-customer-icon"></image>
<text>联系客服</text>
</view> -->
</view>
<view class="detail-info-user__time">
<view class="detail-info-user__time__left">
<text class="detail-info-user__time__left__text1">营业时间</text><text
class="detail-info-user__time__left__text2">{{
sjdetail.business_time
}}</text>
</view>
<view class="detail-info-user__time__right" @click="goInformation">
<text>经营信息</text>
<image src="/static/images/shop/right.png" class="detail-info-user__time__right__img"></image>
</view>
</view>
<view class="detail-info-user__tabs">
<view v-for="(item, index) in tabsPopList" :key="index" class="detail-info-user__tabs__tab">
{{ item.name }}
</view>
</view>
<!-- 修改后的联系方式区域 -->
<view class="detail-info-user__connect">
<!-- 第一行:地址和距离 -->
<view class="connect-row address-row">
<view class="address-section" @click="openMap">
<view class="address-content">
<text class="address-text">{{ sjdetail.address }}</text>
<image src="/static/images/shop/right.png" class="address-arrow"></image>
</view>
</view>
<view class="distance-section" v-if="sjdetail.distance">
<!-- <text class="distance-text">距您</text> -->
<image src="/static/images/icons/address_icon.png" class="address-icon"></image>
<text class="distance-value">{{ sjdetail.distance.toFixed(2) }}Km</text>
</view>
</view>
<!-- 第二行:电话和图标 -->
<view class="connect-row phone-row">
<view class="phone-section" @click="contactService(sjdetail.legal_phone)">
<view class="phone-content">
<text class="phone-label">电话</text>
<text class="phone-number">{{ sjdetail.legal_phone }}</text>
<image src="/static/images/shop/right.png" class="phone-arrow"></image>
</view>
</view>
<view class="icon-section">
<image @click="openMap" src="/static/images/shop/address.png" class="nav-icon"></image>
<image @click="contactService(sjdetail.legal_phone)" src="/static/images/shop/phone.png"
class="phone-icon"></image>
</view>
</view>
</view>
<image src="/static/images/syr/banner.png" mode="widthFix" class="detail-info-user__banner"
referrer="no-referrer"></image>
<!-- 营业执照选项 -->
<!-- <view class="business-license-section" @click="viewBusinessLicense">
<image src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/f083ec38-a325-48a2-a66b-e8ea34b63648.png" class="license-icon"></image>
<view class="license-info">
<text class="license-title">营业执照</text>
</view>
<view class="license-view">
<text>点击查看</text>
<image src="/static/images/shop/right.png" class="license-arrow"></image>
</view>
</view> -->
</view>
<!-- 卡片外的切换标签(无背景) -->
<view class="shop-tabs-outside">
<view :class="['shop-tab-outside', activeTab === 'projects' ? 'active' : '']"
@click="scrollToSection('projects-section')">
全部项目
</view>
<view :class="['shop-tab-outside', activeTab === 'artisans' ? 'active' : '']"
@click="scrollToSection('artisans-section')" v-if="artisanList.length > 0">
手艺人
</view>
</view>
<!-- 全部项目部分 -->
<view id="projects-section" class="detail-info-shop">
<!-- 卡片内显示当前激活的标签名称(红色,有背景) -->
<!-- <view class="shop-tabs-inside">
<view class="shop-tab-inside active">
全部项目
</view>
</view> -->
<!-- 全部项目页面 -->
<projectTabs :tabsPopList="tabsPopList" @clickTap="clickTap" @clickPopTap="clickPopTap"></projectTabs>
<CommonList background="transparent" ref="groupRef" :apiUrl="'/user/getserverlist'"
:listScrollHeight="`${count * 200 + 80}rpx`" @load-success-all="listSuccess">
<template #listData="{ list }">
<serviceCardList :list="list"></serviceCardList>
</template>
<!-- 空数据状态 -->
<template #empty>
<noData top="0"></noData>
</template>
</CommonList>
</view>
</view>
<!-- 手艺人展示板块只有有手艺人时才显示 -->
<view id="artisans-section" class="artisan-showcase-section" v-if="artisanList.length > 0 || showMockArtisans">
<view class="showcase-header">
<text class="showcase-title">手艺人展示({{ displayArtisanCount }})</text>
<view class="view-all-btn" @click="viewAllArtisans">
<text>查看全部</text>
<image src="/static/images/shop/right.png" class="view-all-arrow"></image>
</view>
</view>
<scroll-view class="showcase-scroll" scroll-x="true" :scroll-left="scrollLeft" show-scrollbar="false">
<view class="showcase-list">
<view v-for="(artisan, index) in displayArtisanList" :key="index" class="showcase-item"
@click="viewArtisanDetail(artisan)">
<image :src="artisan.avatar" class="showcase-avatar" mode="aspectFill"></image>
<text class="showcase-name">{{ artisan.name }}</text>
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import {
handleImgSize,
handleImgSizeUni
} from '@/utils/service.js'
import _public from "@/utils/public";
import permissionUtils from "@/utils/per";
import CommonList from "@/components/common/CommonList.vue";
import request from "../../utils/request";
import projectTabs from "./components/project-tabs.vue";
import serviceCardList from "./components/serviceCardList.vue";
export default {
components: {
projectTabs,
CommonList,
serviceCardList,
},
data() {
return {
imgVideoList: {},
count: 1,
sjdetail: {
qualifications: [],
},
distance: 12.31, //距离
queryData: {
publish_user_id: null,
server_kind: 2,
page: 1,
limit: 10,
order_type: 1,
},
tabsPopList: [],
showPopup: false,
userObj: {},
autoShare: false,
autoShareExecuted: false,
activeTab: 'projects', // 当前激活的标签,用于样式控制
artisanList: [], // 手艺人列表
artisanLoading: false, // 手艺人加载状态
artisanFinished: false, // 手艺人是否已加载完毕
artisanPage: 1, // 手艺人当前页码
artisanLimit: 10, // 手艺人每页数量
artisanTotal: 0, // 手艺人总数量
// 手艺人滚动相关
scrollLeft: 0,
// 手艺人的模拟数据
showMockArtisans: false, // 是否显示模拟手艺人数据调试时设为true正式时设为false
mockArtisanList: [{
id: 1,
name: '张美甲师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 2,
name: '李美睫师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 3,
name: '王美容师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 4,
name: '刘纹绣师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 5,
name: '陈造型师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 6,
name: '赵皮肤师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 7,
name: '钱美发师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
},
{
id: 8,
name: '孙按摩师',
avatar: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png',
}
]
};
},
computed: {
headPhoto() {
if (this.sjdetail.head_photo == "-" || !this.sjdetail.head_photo) {
return `https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40`
} else {
return this.sjdetail.head_photo
}
},
// 显示的艺人列表
displayArtisanList() {
// 如果有真实数据且不为空,显示真实数据
if (this.artisanList.length > 0) {
return this.artisanList;
}
// 否则显示模拟数据
return this.mockArtisanList;
},
// 显示的艺人数量
displayArtisanCount() {
if (this.artisanList.length > 0) {
return this.artisanList.length;
}
return this.mockArtisanList.length;
}
},
onLoad(options) {
console.log(options);
this.queryData.publish_user_id = options.id;
// 检查是否需要自动分享
if (options.autoShare === '1') {
this.autoShare = true;
}
let userAdrees = uni.getStorageSync("userAdrees");
if (userAdrees) {
this.userObj.userLngz = userAdrees.longitude;
this.userObj.userLat = userAdrees.latitude;
} else {
this.userObj.userLngz = "117.330043";
this.userObj.userLat = "38.372266";
}
this.userObj.id = options.id;
this.getShopDetail();
this.$nextTick(() => {
this.search();
});
// 获取手艺人列表
this.getArtisanList();
this.getImgVideoList();
},
methods: {
goAlbum() {
uni.navigateTo({
url: `/pages/album/index?id=${this.queryData.publish_user_id}&user_type=2`
});
},
getImgVideoList() {
request.post("/user/imgVideo/main", {
user_id: this.queryData.publish_user_id,
user_type: 2
}).then(res => {
if (res.code == 200) {
this.imgVideoList = res.data
}
})
},
listSuccess(e) {
if (e.count) {
this.count = e.count <= 4 ? e.count : 4;
}
// 更新项目列表
if (e.list) {
this.projectList = e.list;
this.updateDisplayedProjects();
}
},
// 更新显示的项目列表默认显示5个
updateDisplayedProjects() {
if (this.showAllProjects) {
this.displayedProjects = this.projectList;
} else {
this.displayedProjects = this.projectList.slice(0, 5);
}
},
// 加载更多项目
loadMoreProjects() {
this.showAllProjects = true;
this.updateDisplayedProjects();
// 重新搜索以获取完整列表
this.search();
},
// 滚动到指定部分
scrollToSection(sectionId) {
// 如果是手艺人部分且没有手艺人,则返回
if (sectionId === 'artisans-section' && this.displayArtisanList.length === 0) {
return;
}
// 更新激活标签状态
this.activeTab = sectionId === 'projects-section' ? 'projects' : 'artisans';
// 使用uni.scrollTo滚动到指定元素
uni.createSelectorQuery().select(`#${sectionId}`).boundingClientRect((rect) => {
if (rect) {
// 获取页面滚动位置
uni.createSelectorQuery().selectViewport().scrollOffset((scrollOffset) => {
// 计算目标位置考虑navbar高度
const targetTop = rect.top + scrollOffset.scrollTop - 130;
uni.pageScrollTo({
scrollTop: targetTop,
duration: 300
});
}).exec();
}
}).exec();
},
// 查看全部手艺人
viewAllArtisans() {
// 跳转到手艺人列表页面传递店铺ID
uni.navigateTo({
url: `/pages/user/store-syr-list?shopId=${this.queryData.publish_user_id}`
});
},
openMap() {
// #ifdef MP-WEIXIN
uni.openLocation({
success: () => console.log("打开系统位置地图成功"),
fail: (error) => console.log(error),
});
// #endif
// #ifdef APP-PLUS
_public.goMap({
latitude: parseFloat(this.sjdetail.latitude),
longitude: parseFloat(this.sjdetail.longitude),
name: this.sjdetail.name,
address: this.sjdetail.address,
});
// #endif
},
async contactService(phone) {
const systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === "ios") {
uni.makePhoneCall({
phoneNumber: phone
});
} else {
let permission =
systemInfo.platform === "ios" ?
"phone" :
"android.permission.CALL_PHONE";
this.isShowPer = true;
const firstRequest = !plus.storage.getItem(`perm_${permission}`);
if (firstRequest) this.isShowPer = true;
const {
granted
} = await permissionUtils.checkPermission(
"phone",
"需要拨打电话权限,方便您联系商家或平台"
);
if (granted) {
this.isShowPer = false;
uni.makePhoneCall({
phoneNumber: phone
});
return;
}
this.isShowPer = false;
const confirm = await this.showPermissionDialog(
"拨打电话权限申请",
"我们需要拨打电话权限,方便您联系商家或平台"
);
if (!confirm) return;
const result = await permissionUtils.requestPermission(
"phone",
"需要拨打电话权限,方便您联系商家或平台"
);
if (result) {
uni.makePhoneCall({
phoneNumber: phone
});
} else {
locationService.openAppSettings();
}
}
},
// 联系客服
contactCustomer() {
// uni.showModal({
// title: '联系客服',
// content: '您可以通过电话或在线客服联系商家',
// confirmText: '拨打电话',
// cancelText: '在线客服',
// success: (res) => {
// if (res.confirm) {
// this.contactService(this.sjdetail.legal_phone);
// } else if (res.cancel) {
// // 跳转到在线客服页面
// uni.navigateTo({
// url: '/pages/chat/customer-service'
// });
// }
// }
// });
},
// 查看营业执照 还不知道是要弹窗形式还是跳转页面 先放着
viewBusinessLicense() {
// if (this.sjdetail.qualifications && this.sjdetail.qualifications.length > 0) {
// // 跳转到营业执照查看页面
// uni.navigateTo({
// url: `/pages/user/business-license?id=${this.sjdetail.id}`
// });
// } else {
// uni.showToast({
// title: '暂无营业执照信息',
// icon: 'none'
// });
// }
},
// 获取手艺人列表
getArtisanList() {
// 如果正在加载或已加载完毕,则不再请求
if (this.artisanLoading || this.artisanFinished) {
return;
}
this.artisanLoading = true;
const params = {
sjid: this.queryData.publish_user_id // 使用店铺ID作为商家ID
};
console.log("请求手艺人列表参数:", params);
// 如果是调试模式,直接使用模拟数据
if (this.showMockArtisans) {
console.log("使用模拟手艺人数据");
this.artisanList = this.mockArtisanList;
this.artisanLoading = false;
return;
}
// 真实接口调用
request
.post("/user/sjSyrBind/syrList", params)
.then((res) => {
console.log("手艺人列表接口返回:", res);
if (res.code === 200) {
// 注意接口返回的data是一个对象包含count和list
const resultData = res.data || {};
const list = resultData.list || [];
const total = resultData.count || list.length || 0;
console.log("获取到手艺人数据:", list, "总数:", total);
// 格式化数据
const formattedList = this.formatArtisanList(resultData);
console.log("格式化后的手艺人数据:", formattedList);
// 如果是第一页,直接赋值;否则追加数据
if (this.artisanPage === 1) {
this.artisanList = formattedList;
} else {
this.artisanList = [...this.artisanList, ...formattedList];
}
this.artisanTotal = total;
// 判断是否已加载完毕
if (list.length < this.artisanLimit) {
this.artisanFinished = true;
} else {
this.artisanPage += 1;
}
} else {
console.error("接口返回错误:", res);
uni.showToast({
title: res.msg || '获取手艺人列表失败',
icon: 'none'
});
}
})
.catch((err) => {
console.error("获取手艺人列表失败:", err);
uni.showToast({
title: '网络错误,请重试',
icon: 'none'
});
})
.finally(() => {
this.artisanLoading = false;
});
},
// 格式化手艺人列表数据
formatArtisanList(data) {
console.log("开始格式化手艺人数据:", data);
const list = data.list || [];
if (!list || list.length === 0) {
return [];
}
return list.map((item, index) => {
console.log("处理手艺人数据项:", item);
// 解析服务技能从PHP序列化字符串中解析
let tags = [];
if (item.servers_kill) {
try {
// 尝试解析PHP序列化字符串
if (item.servers_kill.startsWith('a:')) {
// 简单提取数字ID实际项目中可能需要映射到具体技能名称
const matches = item.servers_kill.match(/i:\d+;i:(\d+)/g);
if (matches) {
tags = matches.map(match => {
const id = match.split(':')[2];
return `技能${id}`;
});
}
}
} catch (e) {
console.error("解析servers_kill失败:", e);
}
}
// 从业年限计算
let experience = "经验丰富";
if (item.add_time) {
const addDate = new Date(item.add_time);
const now = new Date();
const yearsDiff = now.getFullYear() - addDate.getFullYear();
const monthsDiff = now.getMonth() - addDate.getMonth();
const totalMonths = yearsDiff * 12 + monthsDiff;
if (totalMonths > 0) {
if (totalMonths >= 12) {
const years = Math.floor(totalMonths / 12);
experience = `${years}年经验`;
} else {
experience = `${totalMonths}个月经验`;
}
}
}
// 标签(使用技能中的第一个或默认)
let tag = tags.length > 0 ? tags[0] : "专业技师";
// 从模拟数据中借用一些数据来丰富显示
const mockTags = ["高级美甲师", "美睫专家", "美容顾问", "纹绣大师", "造型设计", "皮肤管理", "发型总监", "按摩理疗"];
const tagIndex = index % mockTags.length;
return {
id: item.id || index,
name: item.name || item.nick_name || `手艺人${index + 1}`,
avatar: item.head_photo ||
"https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png",
experience: experience,
tag: tag || mockTags[tagIndex],
serviceCount: item.service_count || 0,
goodRating: item.good_rating || '100%'
};
});
},
// 查看手艺人详情
viewArtisanDetail(artisan) {
uni.navigateTo({
url: `/pages/user/employee-detail?id=${artisan.id}`
});
},
setShare(imageUrl) {
// 备用图片地址(常量提取,方便统一维护)
const backupImageUrl =
"https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40";
// 获取页面栈,用于返回
const pages = getCurrentPages();
// 生成分享配置的公共函数(接收图片地址,返回完整配置)
const getShareConfig = (imgUrl) => ({
provider: "weixin",
scene: "WXSceneSession",
type: 5,
title: "好友刚推了个超赞商家点开认识TA ~",
miniProgram: {
id: "gh_89c92e18b70b", // 小程序原始ID
path: `/subPackages/user/store-detail?id=${this.sjdetail.id}`, // 动态路径直接用this无需_that
type: this.$store.state.wxShareType, // 版本类型
webUrl: "https://www.baidu.com/", // 降级网页地址
},
imageUrl: imgUrl, // 动态传入图片地址
success: (res) => {
console.log("分享成功:", JSON.stringify(res));
// 延迟返回并显示成功提示
setTimeout(() => {
// 返回上一页即profile页面
uni.navigateBack({
delta: 1,
success: () => {
// 在profile页面显示分享成功提示
// 使用事件总线或全局状态传递消息
uni.showToast({
title: '分享成功',
icon: 'success',
duration: 1000
});
}
});
}, 500); // 延迟0.5秒,让用户看到分享界面
},
fail: (err) => {
console.log("分享失败:", JSON.stringify(err));
uni.showToast({
title: '分享失败',
icon: 'none',
duration: 1000
});
// 分享失败也返回,但提示失败
setTimeout(() => {
uni.navigateBack({
delta: 1,
success: () => {
uni.showToast({
title: '分享失败',
icon: 'none',
duration: 2000
});
}
});
}, 1500);
},
});
// 首次分享使用传入的imageUrl
uni.share(getShareConfig(imageUrl))
.catch(() => {
// 首次失败时,自动使用备用图重试
console.log("首次分享图片无效,尝试备用图片分享...");
uni.share(getShareConfig(backupImageUrl));
});
},
async goInvite() {
let _that = this;
let imageUrl =
"https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40";
var pages = getCurrentPages();
var page = pages[pages.length - 1];
var bitmap = null;
// 获取当前页面 webview 的对象实例
var currentWebview = await page.$getAppWebview();
bitmap = await new plus.nativeObj.Bitmap("store-detail");
// 将webview内容绘制到Bitmap对象中
currentWebview.draw(
bitmap,
function() {
console.log("截屏绘制图片成功", bitmap);
bitmap.save(
"_doc/a.jpg", {},
async function(i) {
imageUrl = i.target;
try {
// 直接调用导入的函数,不要加 this
const processedUrl = await handleImgSizeUni(i.target);
console.log("处理后的图片地址:", processedUrl);
// 赋值给组件数据
imageUrl = processedUrl;
} catch (err) {
console.error("处理失败:", err);
}
_that.setShare(imageUrl);
bitmap.clear();
},
function(e) {
_that.setShare(imageUrl);
console.log("保存图片失败:" + JSON.stringify(e));
}
);
},
function(e) {
_that.setShare(imageUrl);
console.log("截屏绘制图片失败:" + JSON.stringify(e));
}
);
},
previewImage(index) {
// uni.previewImage({
// urls: this.photoList,
// current: index
// })
},
clickTap(e) {
if (e.order_type) {
this.queryData.order_type = e.order_type;
this.search();
}
},
clickPopTap(e) {
this.queryData.first_class = e;
this.search();
},
// 去资质页
goInformation() {
uni.navigateTo({
url: `/pages/user/store-detail-information?id=${this.queryData.publish_user_id}`,
});
},
// 获取商家详情
getShopDetail() {
request
.post("/user/sjdetail", this.userObj)
.then((res) => {
this.sjdetail = res.data;
// this.sjdetail.distance = this.sjdetail.distance.toFixed(2)
this.tabsPopList = [];
this.sjdetail.servers_kill.forEach((element, index) => {
let obj = {
id: element,
name: this.sjdetail.servers_kill_arr[index],
active: false,
};
this.tabsPopList.push(obj);
});
// 如果需要自动分享且未执行过
if (this.autoShare && !this.autoShareExecuted) {
this.autoShareExecuted = true;
// 等待页面渲染
setTimeout(() => {
this.autoTriggerShare();
}, 800);
}
})
.catch((err) => {
console.log(err);
// 加载失败时隐藏loading
if (this.autoShareLoading) {
uni.hideLoading();
this.autoShareLoading = false;
uni.showToast({
title: '加载失败',
icon: 'none'
});
}
});
},
// 自动触发分享
autoTriggerShare() {
// #ifdef APP-PLUS
console.log('开始自动分享');
this.goInvite();
// #endif
// #ifdef MP-WEIXIN
uni.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
});
uni.showToast({
title: '请点击右上角分享',
icon: 'none',
duration: 2000
});
// #endif
},
search() {
// 重置项目显示状态
this.showAllProjects = false;
// 触发列表刷新
this.$nextTick(() => {
this.$refs.groupRef?.manualRefresh(this.queryData);
});
},
},
};
</script>
<style lang="less">
.detail-page {
padding-bottom: 200rpx;
/* 主图区域 */
.main-image-section {
position: relative;
width: 750rpx;
height: 602rpx;
background-color: #999;
.banner-swiper {
width: 750rpx;
height: 602rpx;
position: relative;
.banner-image {
width: 750rpx;
height: 602rpx;
}
.album {
position: absolute;
bottom: 25rpx;
left: 20rpx;
height: 44rpx;
width: 184rpx;
background: rgba(0, 0, 0, 0.4);
border-radius: 23rpx;
.album-left {
width: 73rpx;
height: 44rpx;
background: #FFFFFF;
border-radius: 23rpx;
display: flex;
align-items: center;
justify-content: center;
line-height: 40rpx;
font-weight: 400;
font-size: 22rpx;
text-align: center;
color: #333333;
}
.album-line {
width: 2rpx;
height: 20rpx;
background: #A09C9E;
border-radius: 1rpx;
margin: 0 18rpx;
}
.album-right {
height: 44rpx;
.album-right-text {
// width: 44rpx;
// height: 44rpx;
// border-radius: 23rpx;
// min-width: 50rpx;
//line-height: 44rpx;
transform: translateY(-4rpx);
font-weight: 400;
font-size: 22rpx;
text-align: center;
color: #FFFFFF;
}
.album-right-img {
width: 8rpx;
height: 16rpx;
padding-left: 8rpx;
}
}
}
}
}
.detail-info {
margin-top: 20rpx;
padding: 0 20rpx;
position: relative;
.detail-info-user {
padding: 20rpx 26rpx 20rpx 30rpx;
background: #ffffff;
border-radius: 20rpx;
.detail-info-user__heard {
display: flex;
flex-wrap: nowrap;
align-items: center;
position: relative;
&__photo {
width: 122rpx;
height: 122rpx;
margin-right: 17rpx;
border-radius: 10rpx;
flex-shrink: 0;
/* 防止头像被压缩 */
}
&__name {
margin-bottom: 15rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
flex: 1;
&__text {
margin-bottom: 10rpx;
font-weight: 500;
font-size: 42rpx;
color: #333333;
// line-height: 80rpx;
text-align: left;
font-style: normal;
width: 100%;
overflow: hidden;
// text-overflow: ellipsis;
white-space: wrap;
}
&__sales {
display: flex;
align-items: center;
justify-content: flex-start;
flex-wrap: nowrap;
&__text1 {
font-weight: 400;
font-size: 22rpx;
color: #aaaaaa;
line-height: 30rpx;
text-align: left;
font-style: normal;
display: inline-flex;
align-items: center;
}
&__text2 {
margin-left: 11rpx;
margin-right: 2rpx;
margin-bottom: 2rpx;
font-family: DINPro, DINPro;
font-weight: bold;
font-size: 25rpx;
color: #666666;
line-height: 30rpx;
text-align: left;
font-style: normal;
display: inline-flex;
align-items: center;
}
}
}
/* 联系客服按钮 */
.contact-customer-btn {
width: 114rpx;
height: 89rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 20rpx;
border: #D9DBDB 1rpx solid;
background: linear-gradient(180deg, #FAF9F9 0%, #FFFFFF 100%);
margin-left: 20rpx;
flex-shrink: 0;
padding: 5rpx;
transition: all 0.2s ease;
.contact-customer-icon {
width: 36rpx;
height: 34rpx;
margin-bottom: 8rpx;
}
text {
font-size: 20rpx;
color: #666666;
font-weight: 400;
}
&:active {
// background: linear-gradient( 180deg, #FAF9F9 0%, #FFFFFF 100%);
transform: scale(0.99);
box-shadow: inset 0 2rpx 4rpx rgba(0, 0, 0, 0.2);
/* 内阴影凹陷效果 */
}
}
}
.detail-info-user__time {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 31rpx;
&__left {
font-size: 28rpx;
color: #333333;
line-height: 40rpx;
text-align: left;
font-style: normal;
&__text1 {
font-weight: 600;
}
&__text2 {
margin-left: 8rpx;
font-weight: 500;
font-family: DINPro, DINPro;
}
}
&__right {
font-weight: 400;
font-size: 24rpx;
color: #666666;
line-height: 33rpx;
text-align: left;
font-style: normal;
&__img {
width: 11rpx;
height: 20rpx;
margin-left: 12rpx;
}
}
}
.detail-info-user__tabs {
margin-top: 16rpx;
padding-bottom: 23rpx;
border-bottom: 2rpx solid #f5f3f3;
display: flex;
gap: 20rpx;
flex-wrap: wrap;
/* 允许标签按行换行排列 */
&__tab {
flex-shrink: 0;
/* 禁止子项被压缩换行 */
background: #f5f5f5;
border-radius: 8rpx;
padding: 0 8rpx;
font-weight: 400;
font-size: 20rpx;
color: #666666;
line-height: 28rpx;
text-align: left;
font-style: normal;
}
}
.detail-info-user__connect {
margin-top: 20rpx;
.connect-row {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
&:last-child {
margin-bottom: 0;
}
&.address-row {
align-items: flex-start;
}
.address-section {
flex: 1;
margin-right: 20rpx;
.address-content {
display: flex;
align-items: center;
font-weight: 500;
font-size: 24rpx;
color: #333333;
line-height: 33rpx;
.address-text {
// flex: 1;
// width: 460rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.address-arrow {
width: 11rpx;
height: 20rpx;
margin-left: 10rpx;
flex-shrink: 0;
}
}
}
.distance-section {
flex-shrink: 0;
font-weight: bold;
font-size: 24rpx;
color: #999999;
line-height: 28rpx;
text-align: right;
display: flex;
align-items: center;
.address-icon {
width: 20rpx;
height: 23rpx;
margin-top: 2rpx;
}
.distance-value {
font-family: "DINPro";
margin-left: 6rpx;
}
}
.phone-section {
flex: 1;
.phone-content {
display: flex;
align-items: center;
font-weight: 400;
font-size: 24rpx;
color: #333333;
line-height: 33rpx;
.phone-label {
margin-right: 6rpx;
}
.phone-number {
margin-right: 10rpx;
}
.phone-arrow {
width: 11rpx;
height: 20rpx;
}
}
}
.icon-section {
display: flex;
align-items: center;
flex-shrink: 0;
.nav-icon,
.phone-icon {
width: 43rpx;
height: 43rpx;
margin-left: 40rpx;
}
}
}
}
.detail-info-user__banner {
width: 100%;
margin-top: 30rpx;
}
/* 营业执照选项 */
.business-license-section {
display: flex;
align-items: center;
.license-icon {
width: 32rpx;
height: 26rpx;
margin-right: 15rpx;
}
.license-info {
flex: 1;
.license-title {
font-size: 28rpx;
color: #333333;
font-weight: 500;
}
}
.license-view {
display: flex;
align-items: center;
text {
font-size: 24rpx;
color: #666666;
}
.license-arrow {
width: 11rpx;
height: 20rpx;
margin-left: 10rpx;
}
}
}
}
/* 卡片外的切换标签样式无背景 */
.shop-tabs-outside {
display: flex;
margin: 20rpx 0rpx 0 0;
.shop-tab-outside {
font-size: 30rpx;
line-height: 42rpx;
color: #333;
margin-right: 50rpx;
padding: 20rpx 10rpx;
position: relative;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
&.active {
color: #FF4767;
}
}
}
.detail-info-shop {
padding: 20rpx;
background: #ffffff;
border-radius: 20rpx;
margin-top: 10rpx;
/* 卡片内的标签样式有背景 */
.shop-tabs-inside {
margin-bottom: 20rpx;
.shop-tab-inside {
font-size: 34rpx;
font-weight: 500;
padding: 10rpx 0;
}
}
.detail-info-shop-title {
width: 136rpx;
height: 48rpx;
font-family: PingFangSC, PingFang SC;
font-weight: 500;
font-size: 34rpx;
color: #333333;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
}
}
/* 手艺人展示板块只有有手艺人时才显示 */
.artisan-showcase-section {
background: #ffffff;
border-radius: 20rpx;
margin: 0rpx 20rpx 0rpx;
padding: 20rpx;
.showcase-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
.showcase-title {
font-size: 28rpx;
color: #333333;
font-weight: 500;
}
.view-all-btn {
display: flex;
align-items: center;
text {
font-size: 24rpx;
color: #666666;
}
.view-all-arrow {
width: 11rpx;
height: 20rpx;
margin-left: 10rpx;
}
}
}
.showcase-scroll {
white-space: nowrap;
width: 100%;
.showcase-list {
display: inline-flex;
.showcase-item {
display: inline-flex;
flex-direction: column;
align-items: center;
margin-right: 35rpx;
white-space: normal;
width: 198rpx;
flex-shrink: 0;
position: relative;
&:last-child {
margin-right: 0;
}
.showcase-avatar {
width: 198rpx;
height: 200rpx;
background: #D8D8D8;
border-radius: 20rpx;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
.showcase-name {
font-size: 28rpx;
color: #333333;
font-weight: 500;
text-align: center;
line-height: 33rpx;
margin-bottom: 8rpx;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.showcase-experience {
font-size: 22rpx;
color: #666666;
text-align: center;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 5rpx;
}
.showcase-tag {
font-size: 20rpx;
color: #FF4767;
background: rgba(232, 16, 30, 0.1);
border-radius: 15rpx;
padding: 4rpx 12rpx;
text-align: center;
width: auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
}
}
::v-deep .list-container {
padding: 0;
}
</style>