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

1464 lines
38 KiB
Vue
Raw Normal View History

2026-03-24 11:45:13 +08:00
<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>
2026-03-25 13:29:04 +08:00
<image v-else src="/static/default.png"
2026-03-24 11:45:13 +08:00
mode="aspectFill" class="banner-image" referrer="no-referrer">
</image>
2026-03-25 13:29:04 +08:00
<cover-view class="album flex-row-center" v-if="imgVideoList.main_video || imgVideoList.main_img">
2026-03-24 11:45:13 +08:00
<cover-view class="album-left flex-row-center-center">
{{ imgVideoList.main_video?"视频":"图片" }}
</cover-view>
<cover-view class="album-line">
</cover-view>
2026-03-25 13:29:04 +08:00
<cover-view class="album-right flex-row-center-center" @click="goAlbum">
2026-03-24 11:45:13 +08:00
<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>
2026-03-25 13:29:04 +08:00
<noData top="0"></noData>
2026-03-24 11:45:13 +08:00
</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: #E8101E;
}
}
}
.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;
2026-03-25 13:29:04 +08:00
margin: 0rpx 20rpx 0rpx;
2026-03-24 11:45:13 +08:00
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: #E8101E;
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>