Files
xdd-uniapp-new/pkg_product/views/sojoumStore.vue
T
2026-04-23 18:19:25 +08:00

1543 lines
38 KiB
Vue

<template>
<view class="container">
<hx-navbar
:fixed="true"
:background-color="[0,[0,0,0,0],[0,0,0,0]]"
:pageScroll.sync="scrollData"
statusBarFontColor="#ffffff"
barPlaceholder="hidden"
transparent="auto"
color='#ffffff'
/>
<view>
<view class="cover-box">
<swiper
style="height: 500rpx"
:autoplay="swiperAutoplay"
circular
@change="swiperChange"
>
<swiper-item v-for="(item, index) in store.banner" :key="index">
<video
v-if="item.type === 'video'"
:src="item.url"
style="width: 100%; height: 100%"
id="coverVideo"
@play="videoPlay"
@ended="videoEnd"
@pause="videoEnd"
></video>
<image
v-else
:src="item.url"
style="width: 100%; height: 100%"
></image>
</swiper-item>
</swiper>
</view>
<view class="v12-pa-3 v12-justify-between v12-align-center">
<view class="sojum-title">{{ store.name }}</view>
<view class="v12-align-center v12-radius-100 v12-primary v12-primary-border" style="height:38rpx">
<view class="v12-align-center v12-font-22 v12-white-text v12-px-2" style=" white-space: nowrap;height: 100%;">营业时间</view>
<view class="v12-align-center v12-primary-border v12-font-22 v12-ml-1 v12-px-2 v12-radius-100 v12-white" style=" white-space: nowrap;height: 100%;">{{ store.serviceTime }} - {{ store.serviceEndTime }}</view>
</view>
</view>
<view class="v12-pa-3 " v-if="store.tags" style="display: flex;flex-wrap: wrap; align-items: center;">
<view v-for="value in store.tags.split(',')" :key="value" class="v12-px-2 v12-radius-100 v12-mr-2 v12-mb-2 v12-font-24" style="width: fit-content; border: 2rpx solid #999; color: #666;">{{ value }}</view>
</view>
<view class="inn-signature-wrap" style="margin-top: 0; padding-top: 0;">
<view class="share-btn" @click="changeShare">
<image :src="webUrl + '/page/hotel/share.png'" class="img" />
</view>
</view>
<view v-if="store.name" class="map-wrapper">
<view class="map-cont">
<map
:longitude="store.longitude"
:latitude="store.latitude"
style="width: 750rpx;height: 300rpx;"
/>
</view>
<view class="bg"></view>
<view class="map-info">
<view class="map-info-hd">
<image :src="webUrl + '/page/qianxian/icon-location.png'" class="icon" />
</view>
<view class="map-info-bd more-t">
{{ store.address }}
</view>
<view class="map-info-ft flex">
<view class="item" @click="showLocation">
<image :src="webUrl + '/page/qianxian/icon-addr.png'" class="img" />
<view>导航</view>
</view>
<view class="item" @click="call">
<image :src="webUrl + '/page/qianxian/icon-phone.png'" class="img" />
<view>客服</view>
</view>
</view>
</view>
</view>
<view class="top-tab">
<scroll-view scroll-x class="tab-scroll" :show-scrollbar="false">
<view class="tab-list">
<view
v-for="(item, index) in tabList"
:key="index"
:class="item.isShow ? '' : 'hide'"
class="tab"
@click="changeTab(item.value)"
>
<view :class="activeIndex === item.value ? 'active' : ''" class="tab-item">
{{ item.text }}
</view>
</view>
</view>
</scroll-view>
</view>
<view>
<view
v-if="activeIndex === 0"
class="info-section"
>
<view v-if="isLoadInfoListSuccess">
<view v-if="infoArray.length > 0" class="info-wrapper">
<view class="info-list">
<view
v-for="(item, index) in infoArray"
:key="index"
class="info-item"
>
<view
:class="item.isTop === 1 ? 'info-item-top' : ''"
:style="{
'background-image': item.isTop ? ('url(' + webUrl + '/page/hotel/info-top-bg.png)') : 'none'
}"
class="info-item-header"
>
<view class="name">
{{ item.title }}
</view>
<view class="intro">
<rich-text :nodes="item.content"></rich-text>
</view>
</view>
<view class="info-item-body" v-if="item.images && item.images.length > 0 || item.video">
<view v-if="item.type === 2" class="video">
<view @click="infoItemViewClick(item, index)" v-if="activeVideo !== 'video-item' + index" class="play-icon">
<u-icon name="play-right-fill" color="#fff" size="48"></u-icon>
</view>
<image
v-if="activeVideo !== 'video-item' + index"
:src="item.video + '?vframe/jpg/offset/1'"
:poster="item.video + '?vframe/jpg/offset/1'"
controls
play-btn-position="center"
:show-fullscreen-btn="false"
:id="'video-item' + index"
class="video-item"
@click="infoItemViewClick(item, index)"
/>
<video
v-else
:src="item.video"
controls
autoplay
play-btn-position="center"
:show-fullscreen-btn="false"
class="video-item"
:id="'video-item' + index"
@click="infoItemViewClick(item, index)"
>
</video>
</view>
<view v-else>
<img-box
:imgList="item.images"
:num="item.images.length"
:img-radius="10"
style="width: 100%;"
@click="infoItemViewClick(item, index)"
/>
</view>
</view>
<view class="info-item-bottom">
<view class="time">
{{ item.createTime ? item.createTime.replace(/-/g, '.').substr(0, 10) : '' }}
</view>
<view class="btns">
<view class="flex">
<image
:src="webUrl + '/20230803152147141807.png'"
class="icon"
/>
<text class="seeNum-txt">{{ $formatCount(item.pv) }}</text>
</view>
<view class="flex">
<image
v-if="!item.hasZan"
:src="webUrl + '/page/hotel/zan-off-2.png'"
class="zan-off-icon"
@click="likeInfoItemHandle(item)"
/>
<image
v-else
:src="webUrl + '/page/hotel/zan-on-2.png'"
class="zan-on-icon"
@click="likeInfoItemHandle(item)"
/>
<text
v-show="item.zan > 0"
:class="item.zanVo ? 'on' : ''"
class="seeNum-txt"
>{{ $formatCount(item.zan) }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view v-else class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
<goo-skeleton v-else />
</view>
<view
v-if="activeIndex === 1"
class="pics-section"
>
<view
v-if="store.culture && store.culture.filter(item => item !== '').length > 0"
class="pics-list acea-row"
>
<view
v-for="(url, index) in store.culture"
:key="index"
:style="{ width: picColumnWidth }"
class="pics-item"
@click="showPic(index)"
>
<image
:style="{
width: picColumnWidth,
height: picColumnWidth,
borderRadius: '20rpx'
}"
:src="url"
/>
</view>
</view>
<view v-else class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
<view
v-if="activeIndex === 2"
class="qualifications-section"
>
<view v-if="store.qualification && store.qualification.length > 0">
<image
v-for="(item, index) in store.qualification || []"
:key="index"
:src="item"
class="store-img"
mode="widthFix"
/>
</view>
<view v-else class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
<view v-if="activeIndex === 3" class="v12-pa-3 product-grid" style="background: #F5F5F5;">
<view
v-for="(item, index) in jiaLouProductArr"
:key="index"
class="product-item"
@click="goGroupBuyDetail(item)"
>
<image
:src="item.mainImage"
class="product-img"
/>
<view class="v12-pa-2 v12-font-30 v12-font-bold more-t" style="max-height: 68rpx;">
{{ item.name }}
</view>
<view class="product-info v12-px-2 v12-justify-between">
<view class="v12-primary-text">
<text class="v12-font-22 v12-font-bold">
</text>
<text class="v12-font-30 v12-font-bold">
{{ item.price }}
</text>
</view>
<view class="view-btn">
查看
</view>
</view>
</view>
<view v-if="jiaLouProductArr.length === 0" class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
<!-- 管家 -->
<view v-if="activeIndex === 4" class="v12-pa-3" style="background: #F5F5F5;">
<view v-for="(item, index) in jiaLouStewardArr" :key="index" class="steward-item">
<view class="st-card" @click="goHousekeeperDetail(item)">
<view class="st-left">
<view class="portrait-card" >
<image :src="item.mainImage" class="mainImage-wap" mode="aspectFill" />
<image :src="item.avatar" class="avatar" mode="aspectFill" />
<view class="gg-box">
<view class="v12-font-bold gg">旅居管家</view>
<view class="v12-font-bold v12-white-text">{{ item.name }}</view>
</view>
</view>
</view>
<view class="st-right">
<view class="star">
<image :src="webUrl + '/home/管家角标.png'" class="star-icon" />
</view>
<view class="desc more-t v12-font-bold">
{{ item.intro }}
</view>
<view class="tag-list">
<view v-for="(tag, i) in item.tags" :key="i" class="tag">{{ tag }}</view>
</view>
</view>
</view>
</view>
<view v-if="jiaLouStewardArr.length === 0" class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
<!-- 体验店 -->
<view v-if="activeIndex === 5" class="v12-pa-3" style="background: #F5F5F5;">
<view class="experience-list">
<view v-for="(item, index) in experienceStoreList" :key="index" class="experience-item" @click="goExperienceStoreDetail(item)">
<view class="img-box">
<image :src="item.cover" mode="aspectFill" class="cover-img"></image>
<view class="location-tag" v-if="item.cityName">
<u-icon :name="webUrl + '/home/icon-location.png'" size="18" color="#fff"></u-icon>
<text class="city-name">{{ item.cityName }}</text>
</view>
</view>
<view class="info-box">
<view class="v12-font-32 v12-font-bold t-one">{{ item.name }}</view>
<view class="v12-font-26 v12-dark1-text one-t" style="margin-top: 8rpx; margin-bottom: 16rpx; line-height: 1.4;">{{ item.intro }}</view>
<view class="bottom-row">
<view class="v12-font-20 v12-font-bold">
营业时间:{{ item.serviceTime || '00:00' }}~{{ item.serviceEndTime || '23:59' }}
</view>
<view class="btn-check">
查看
</view>
</view>
</view>
</view>
</view>
<view v-if="experienceStoreList.length === 0" class="tab-no-data">
店主还没有上传内容哦~
</view>
</view>
</view>
<!-- 分享 -->
<u-popup
:show="showShare"
mode="center"
bgColor="transparent"
>
<view class="box-share">
<view class="box-img">
<image
:src="webUrl + '/20230608112219219303.png'"
class="icon"
@click="closeShare"
/>
<image :src="posterUrl" class="main-img" mode="widthFix" />
</view>
<image
:src="webUrl + '/20230608112210135038.png'"
mode="widthFix"
class="btn"
@click="saveImg"
/>
</view>
</u-popup>
</view>
</view>
</template>
<script>
import {
getJiaLouDetail,
getJiaLouNews,
postJiaLouNewsView,
postJiaLouNewsZan,
postJiaLouZan,
postTravelShare,
getJiaLouProductList,
getJiaLouStewardList,
getJiaLouNewsList,
getExperienceStoreList
} from '@/api/qianxian'
import {getUrlParam} from '@/utils/common.js'
import imgBox from '@/components/imageTypeSet/imagebox.vue'
export default {
components: {
imgBox
},
data() {
return {
swiperAutoplay: true,
webUrl: this.$VUE_APP_RESOURCES_URL,
videoStyle: {
width: '750rpx',
height: '500rpx'
},
scrollData: {},
id: '',
store: {},
tabList: [
{ text: '团购', value: 3, isShow: true },
{ text: '管家', value: 4, isShow: true },
{ text: '体验店', value: 5, isShow: true },
{ text: '资讯', value: 0, isShow: true },
// { text: '文化', value: 1, isShow: true },
{ text: '资质', value: 2, isShow: true }
],
activeIndex: 3,
isLoadInfoListSuccess: false,
picColumnWidth: '345rpx',
infoArray: [],
videoPlayers: [],
coverImages: [],
activeVideo: 'coverVideo',
showShare: false,
posterUrl: '',
// 团购产品列表
jiaLouProductArr: [],
// 管家列表
jiaLouStewardArr: [
],
// 体验店列表
experienceStoreList: []
}
},
onPageScroll(e) {
this.scrollData = e
},
onLoad(options) {
const id = options.id || ''
this.id = id
if (id) {
// this.partnerId = options.partnerId || null
} else {
let obj = uni.getEnterOptionsSync()
if (options.scene || obj.query.scene) {
const query = options ? decodeURIComponent(options.scene + '') : decodeURIComponent(obj.query.scene)
this.id = getUrlParam(query, 'id') || null
}
}
this.getFarmerData()
},
watch: {
activeIndex: {
handler(newVal, oldVal) {
if (newVal === 3) {
this.getJiaLouProductList()
}
if (newVal === 4) {
this.getJiaLouStewardList()
}
if (newVal === 5) {
this.getExperienceStoreList()
}
}
}
},
methods: {
swiperChange(e) {
const current = e.detail.current;
const currentItem = this.store.banner[current];
// if (currentItem.includes('.mp4')) {
// this.swiperAutoplay = false;
// } else {
// this.swiperAutoplay = true;
// }
},
videoPlay() {
this.swiperAutoplay = false;
this.coverPlay()
},
videoEnd() {
this.swiperAutoplay = true;
},
goExperienceStoreDetail(item) {
const query = []
const id = item.merId || item.id || ''
query.push('experienceMerchantId=' + encodeURIComponent(id))
uni.navigateTo({
url: '/pkg_product/views/experienceProjectDetail?' + query.join('&')
})
},
goHousekeeperDetail(item) {
uni.navigateTo({
url: '/pkg_product/views/housekeeperDetail?id=' + item.id
})
},
getJiaLouStewardList() {
uni.showLoading({
title: '加载中',
mask: true
})
const params = {
merId: this.store.id,
page: 1,
limit: 99999
}
getJiaLouStewardList(params).then(res => {
if (res.status === 200) {
this.jiaLouStewardArr = res.data.records || []
}
}).finally(() => {
uni.hideLoading()
})
},
getExperienceStoreList() {
uni.showLoading({
title: '加载中',
mask: true
})
const params = {
travelMerchantId: this.store.id,
page: 1,
limit: 99999,
// experienceStoreCategoryId: null // Optional if category filtering is needed
}
getExperienceStoreList(params).then(res => {
if (res.status === 200) {
this.experienceStoreList = res.data.records || []
}
}).finally(() => {
uni.hideLoading()
})
},
getJiaLouProductList() {
uni.showLoading({
title: '加载中',
mask: true
})
const params = {
merId: this.store.id,
page: 1,
limit: 99999
}
getJiaLouProductList(params).then(res => {
if (res.status === 200) {
this.jiaLouProductArr = res.data.records || []
}
}).finally(() => {
uni.hideLoading()
})
},
saveImg() {
const _this = this
uni.getSetting({
success: getRes => {
if (getRes.authSetting["scope.writePhotosAlbum"]) {
_this.downloadImage()
} else {
uni.authorize({
scope: "scope.writePhotosAlbum",
success: () => {
_this.downloadImage()
},
fail: () => {
uni.openSetting({
success: openRes => {
console.log(typeof openRes, openRes)
},
fail: () => {
uni.showToast({
title: "请在设置中打开对应权限",
icon: "none"
})
}
})
}
})
}
},
fail: (err) => {
console.log(err, 2)
}
})
},
downloadImage() {
const _this = this
const randomID = () => Math.random().toString(36).substring(2)
uni.downloadFile({
url: this.posterUrl, // 网络图片的地址
filePath: wx.env.USER_DATA_PATH + "/share_" + randomID() + ".png", // 指定的本地文件路径
success: downRes => {
uni.saveImageToPhotosAlbum({
filePath: downRes.filePath, // 临时文件地址
success: function () {
uni.showToast({
title: "保存成功",
icon: "success",
success() {
_this.showShare = false
}
})
},
fail: function (err) {
uni.showToast({
title: err,
icon: "none"
})
}
})
},
fail: function (err) {
uni.showToast({
title: err.errMsg,
icon: "error"
})
}
})
},
changeShare() {
uni.showLoading()
postTravelShare(this.id).then(res => {
this.posterUrl = res.data
this.showShare = !this.showShare
}).finally(() => {
uni.hideLoading()
})
},
closeShare() {
this.showShare = false
},
goGoodsConByID(item) {
this.$yrouter.push({
path: '/pages/shop/GoodsCon/index',
query: {
id: item.productId
}
})
},
goGroupBuyDetail(item) {
console.log(item);
const id = item.id
uni.navigateTo({ url: '/pkg_product/views/groupBuyDetails?id=' + id })
},
getNews() {
const params = {
page: 1,
limit: 9999,
merId: this.id
}
getJiaLouNewsList(params).then(res => {
this.infoArray = res.data.records || []
this.isLoadInfoListSuccess = true
})
},
changeTab(index) {
this.activeIndex = index
if(index === 0) {
this.getNews()
} else {
this.isLoadInfoListSuccess = false
}
// this.loading = false
// // 刷新数据
// switch (this.activeIndex) {
// case 1:
// this.fetchInnInfoList()
// break
// case 0:
// this.fetchGoods()
// break
// default:
// break
// }
},
showLocation() {
if (!this.store.latitude || !this.store.longitude) {
this.$dialog.error('暂无位置信息')
} else {
uni.openLocation({
latitude: this.store.latitude,
longitude: this.store.longitude
})
}
},
likeInfoItemHandle(item) {
const params = {
travelGroupNewsId: item.id
}
postJiaLouNewsZan(params).then(res => {
const {success} = res
if(success) {
this.getNews()
}
})
},
coverPlay(){
this.activeVideo = 'coverVideo'
this.videoPlayers.forEach(player => {
const playerCtx = uni.createVideoContext(player, this)
playerCtx.pause()
})
},
infoItemViewClick(item, index) {
const playerId = 'video-item' + index
console.log(playerId);
if(item.type === 2) {
const coverCtx = uni.createVideoContext('coverVideo', this)
coverCtx.pause()
this.activeVideo = 'video-item' + index
if(this.videoPlayers.includes(playerId)) {
this.videoPlayers.forEach(player => {
if(player === playerId) return
const playerCtx = uni.createVideoContext(player, this)
playerCtx.pause()
})
} {
this.videoPlayers.push(playerId)
this.videoPlayers.forEach(player => {
if(player === playerId) return
const playerCtx = uni.createVideoContext(player, this)
playerCtx.pause()
})
}
} else {
this.videoPlayers.push(playerId)
}
if(this.videoPlayers.filter(id => id === playerId).length > 1) return
const params = {
travelGroupNewsId: item.id
}
postJiaLouNewsView(params).then(res => {
const {success} = res
if(success) {
this.getNews()
}
})
},
call() {
if (this.store.phone != undefined && this.store.phone.length > 0) {
uni.makePhoneCall({
// 手机号
phoneNumber: this.store.phone,
// 成功回调
success: (res) => {
console.log('调用成功!')
},
// 失败回调
fail: (res) => {
console.log('调用失败!')
}
})
} else {
this.$dialog.error('电话为空')
}
},
getFarmerData() {
getJiaLouDetail(this.id).then(res => {
this.store = res.data || {}
this.store.banner = res.data.banner.map(img => {
return {
type: 'img',
url: img
}
})
if(res.data.video) {
this.store.banner.unshift({
type: 'video',
url: res.data.video
})
}
this.getNews()
this.getJiaLouProductList()
})
},
zanStore() {
const params = {
sojournId: this.id
}
postJiaLouZan(params).then(res => {
const {success} = res
if(success) {
this.getFarmerData()
}
})
},
doneFavorite(has) {
const api = !has ? setFarmerShopCollection : removeFarmerShopCollection
const params = {
farmerShopId: this.id
}
api(params).then(res => {
this.getFarmerData()
})
},
showPic (index) {
uni.previewImage({
current: index,
urls: this.store.culture
})
},
}
}
</script>
<style lang="less" scoped>
@import "@/assets/css/store.less";
.time-box{
border-radius: 100rpx;
}
.sojum-title{
font-weight: bold;
font-size: 44rpx;
color: #333333;
}
.btn {
.img {
display: block;
width: 48rpx;
height: 48rpx;
}
}
.container{
background: #fff;
}
.store-img {
width: 686rpx;
margin-bottom: 20rpx;
vertical-align: middle;
}
.tab-no-data {
text-align: center;
font-size: 32rpx;
color: #999;
line-height: 200rpx;
width: 100%;
}
.btLine {
width: 100%;
height: 6rpx;
margin-top: 18rpx;
background: #0DC5C5;
}
.pics-box {
margin: 36rpx;
background: #fff;
}
.pics-list {
position: relative;
padding: 20rpx 0;
flex-wrap: wrap;
}
.pics-list .pics-item {
margin-left: 20rpx;
margin-top: 10rpx;
}
.info-section,
.pics-section,
.qualifications-section {
position: relative;
background-color: #f6f6f6;
}
.info-section,
.qualifications-section {
padding: 32rpx;
}
.info-section {
word-break: break-all;
.info-item + .info-item {
margin: 32rpx 0 0 0;
}
.info-item {
border-radius: 10rpx;
background-color: #fff;
.info-item-header {
position: relative;
padding: 20rpx 20rpx 0 20rpx;
&.info-item-top {
padding-top: 60rpx;
background-size: 100% 80rpx;
background-repeat: no-repeat;
background-image: url();
}
.name {
font-size: 16px;
color: #333;
font-weight: bold;
}
.intro {
margin: 10rpx 0 0 0;
color: #666;
font-size: 14px;
}
}
.info-item-body {
padding: 0 20rpx 20rpx 20rpx;
.video {
padding: 20rpx 0 0 0;
position: relative;
.play-icon {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
margin: auto;
width: 80rpx;
height: 80rpx;
}
.video-item {
width: 100%;
height: 400rpx;
border-radius: 10rpx;
}
}
}
.info-item-bottom {
display: flex;
align-items: center;
padding: 20rpx;
border-top: 1px solid #f1f1f1;
font-size: 22rpxl;
font-weight: bold;
.time {
flex: 1;
color: #333;
}
.btns {
display: flex;
color: #999;
.flex + .flex {
margin: 0 0 0 32rpx;
}
.flex {
align-items: center;
}
.icon {
width: 32rpx;
height: 32rpx;
margin: 0 8rpx 0 0;
}
.zan-off-icon {
width: 32rpx;
height: 32rpx;
}
.zan-on-icon {
width: 32rpx;
height: 32rpx;
}
.seeNum-txt {
&.on {
color: #D81E06;
}
}
.more-btn {
position: relative;
.more-wrapper {
position: absolute;
right: -20rpx;
top: -150rpx;
z-index: 5;
width: 200rpx;
border-radius: 12rpx;
background-color: #fff;
box-shadow: 0px 1px 6px rgba(0,0,0,0.16);
.more-item + .more-item {
border-top: 1px solid #d5d5d5;
}
.more-item {
display: flex;
align-items: center;
justify-content: center;
height: 70rpx;
font-size: 14px;
color: #333;
.more-icon {
width: 36rpx;
height: 36rpx;
margin: 0 10rpx 0 0;
}
}
}
}
}
}
}
}
.goods-section {
padding: 40rpx 32rpx 0;
background: #f0f0f0;
.item {
position: relative;
width: 332rpx;
height: 528rpx;
box-sizing: border-box;
margin-right: 22rpx;
margin-bottom: 24rpx;
border-radius: 20rpx;
background: #fff;
overflow: hidden;
display: flex;
flex-direction: column;
justify-content: space-between;
.name {
padding: 8rpx 6rpx;
font-size: 26rpx;
line-height: 36rpx;
color: #333333;
height: 70rpx;
}
.price-line {
padding: 0 10rpx;
font-size: 26rpx;
line-height: 38rpx;
color: #ED0F0F;
}
.sales-line {
position: absolute;
bottom: 0;
width: 100%;
padding: 8rpx 10rpx 18rpx;
border-top: 1rpx solid #EFEFEF;
font-size: 24rpx;
line-height: 34rpx;
color: #8D8D8D;
}
}
.item:nth-child(2n) {
margin-right: 0;
}
.cover {
width: 332rpx;
height: 332rpx;
background: rgba(255, 255, 255, 0.39);
border-radius: 8rpx;
vertical-align: middle;
}
.label {
width: 40rpx;
height: 24rpx;
margin-right: 4rpx;
vertical-align: middle;
}
.icon {
width: 24rpx;
height: 24rpx;
margin-right: 6rpx;
vertical-align: middle;
}
.btn {
display: flex;
justify-content: center;
.btn-cont {
padding: 13rpx 30rpx;
border: 1px solid #0DC5C5;
border-radius: 8rpx;
color: #0DC5C5;
.iconfont {
margin: 0 0 0 20rpx;
font-size: 24rpx;
}
}
}
}
.btLine {
width: 100%;
height: 6rpx;
margin-top: 18rpx;
background: #0DC5C5;
}
.tab-item-active {
color:#080F1A;
font-size:32rpx;
}
.tab-item-no-active {
color:#A6AAB3;
font-size:28rpx;
}
.experience-list {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.experience-item {
width: 343rpx;
background: #fff;
border-radius: 16rpx;
overflow: hidden;
margin-bottom: 20rpx;
box-shadow: 0 2rpx 10rpx rgba(0,0,0,0.05);
.img-box {
position: relative;
width: 100%;
height: 335rpx;
border-radius: 16rpx;
.cover-img {
width: 100%;
height: 100%;
border-radius: 16rpx;
}
.location-tag {
position: absolute;
bottom: 10rpx;
left: 10rpx;
display: flex;
align-items: center;
// background: rgba(0,0,0,0.5);
// padding: 4rpx 10rpx;
// border-radius: 20rpx;
.city-name {
color: #fff;
font-size: 20rpx;
margin-left: 4rpx;
}
}
}
.info-box {
padding: 16rpx;
.name {
font-size: 28rpx;
font-weight: bold;
color: #333;
margin-bottom: 8rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.intro {
font-size: 22rpx;
color: #999;
margin-bottom: 16rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.bottom-row {
display: flex;
justify-content: space-between;
align-items: center;
.time {
font-size: 20rpx;
color: #666;
}
.btn-check {
background: #C52733;
color: #fff;
font-size: 24rpx;
padding: 4rpx 16rpx;
border-radius: 20rpx;
}
}
}
}
}
.top-tab {
padding-bottom: 30rpx;
padding-top: 30rpx;
background: #fff;
.tab-scroll {
width: 100%;
white-space: nowrap;
.tab-list {
display: inline-flex;
padding: 0 30rpx;
}
}
.tab {
display: inline-block;
width: fit-content;
margin-right: 20rpx;
&:last-child {
margin-right: 0;
}
.tab-item {
height: 52rpx;
padding: 0 30rpx;
border-radius: 26rpx;
font-size: 32rpx;
line-height: 52rpx;
font-weight: bold;
&.active {
color: #fff;
background: linear-gradient(90deg, #C52733 0%, rgba(211,92,101,0.91) 54%, rgba(255,255,255,0.62) 100%);
}
}
&.hide {
display: none;
}
}
}
.map-wrapper {
position: relative;
z-index: 2;
height: 200rpx;
margin: 40rpx 0 0 0;
overflow: hidden;
.map-cont {
position: absolute;
top: 0;
left: 0;
z-index: 2;
width: 100%;
opacity: 0.3;
transform: translateY(-50rpx);
}
.bg {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 3;
height: 60rpx;
background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
}
.map-info {
position: relative;
z-index: 5;
display: flex;
align-items: center;
padding: 40rpx 30rpx 40rpx 32rpx;
color: #333;
font-size: 14px;
background: rgba(255,255,255,0.4);
.map-info-hd {
.icon {
display: block;
width: 34rpx;
height: 42rpx;
}
}
.map-info-bd {
flex: 1;
padding: 0 60rpx 0 20rpx;
line-height: 60rpx;
}
.map-info-ft {
.item + .item {
margin: 0 0 0 6rpx;
}
.item {
text-align: center;
font-weight: 500;
.img {
display: block;
width: 64rpx;
height: 64rpx;
margin: 0 0 16rpx 16rpx;
}
}
}
}
}
.inn-signature-wrap {
position: relative;
z-index: 5;
padding: 0 32rpx;
margin: 20rpx 0 0 0;
.triangle {
position: absolute;
top: -20rpx;
left: 72rpx;
width: 0;
height: 0;
border-left: 20rpx solid transparent;
border-right: 20rpx solid transparent;
border-bottom: 24rpx solid rgba(243,243,246,0.39);
}
.inn-signature {
position: relative;
padding: 20rpx;
border-radius: 20rpx;
font-size: 24rpx;
color: #080F1A;
background: #fff;
box-shadow: 0px 0px 7px 1px rgba(0, 0, 0, 0.08);
}
.share-btn {
position: absolute;
right: 0;
bottom: -68rpx;
.img {
width: 212rpx;
height: 60rpx;
}
}
}
.zan-favorite-wrap {
font-size: 32rpx;
color: #333;
.on {
color: #FF564A;
}
}
.zan-box {
.img {
width: 36rpx;
height: 36rpx;
margin: 0 8rpx 0 0;
vertical-align: middle;
}
}
.favorite-box {
.icon {
width: 36rpx;
height: 36rpx;
margin: 0 8rpx 0 30rpx;
}
}
.cover-box {
position: relative;
.full-img {
width: 750rpx;
}
.video {
display: block;
width: 100%;
height: 100%;
}
}
.innInfoWrap {
position: relative;
margin-top: -76rpx;
padding: 20rpx 36rpx;
line-height: 1;
z-index: 1;
.bg-color {
position: absolute;
top: -5px;
left: 0;
right: 0;
z-index: 1;
height: 50%;
background: linear-gradient(-180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
.box-mask {
position: absolute;
bottom: 0;
right: 0;
left: 166rpx;
box-sizing: border-box;
padding: 0 32rpx 12rpx 0;
.city-section {
width: 256rpx;
margin-left: 20rpx;
}
}
}
.body-cont {
position: relative;
z-index: 2;
}
}
.inn-logo {
flex-shrink: 0;
width: 56*2rpx;
height: 56*2rpx;
margin-right: 18rpx;
}
.inn-logo image {
width: 100%;
height: 100%;
border-radius: 50%;
}
.inn-name {
width: 280rpx;
font-size: 32rpx;
color: #FFFFFF;
line-height: 48rpx;
}
.inn-owner {
font-size: 24rpx;
color: #8B8F99;
}
.guarantee{
color: #8B8F99;
margin-top: 4rpx;
}
.product-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.product-item{
width: 340rpx;
background: #fff;
border-radius: 16rpx;
overflow: hidden;
padding-bottom: 20rpx;
margin-bottom: 24rpx;
.product-img{
width: 340rpx;
height: 340rpx;
border-radius: 16rpx;
}
}
.view-btn{
background: #F9E49D;
border-radius: 100rpx;
padding: 0rpx 16rpx;
color: #333;
width: fit-content;
}
/* steward-item styles */
.steward-item {
margin-bottom: 24rpx;
}
.st-card {
display: flex;
background: #fff;
border-radius: 24rpx;
padding: 24rpx;
position: relative;
}
.st-left {
width: 260rpx;
margin-right: 24rpx;
}
.portrait-card {
width: 100%;
height: 320rpx;
border-radius: 36rpx;
background: linear-gradient(180deg, #f7f7f7 0%, #ededed 100%);
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
overflow: hidden;
}
.avatar {
width: 180rpx;
height: 200rpx;
border-radius: 16rpx;
}
.role-badge,
.name-badge {
position: absolute;
left: 50%;
transform: translateX(-50%);
border-radius: 50rpx;
padding: 8rpx 16rpx;
font-size: 24rpx;
line-height: 32rpx;
}
.role-badge {
bottom: 80rpx;
background: rgba(0,0,0,0.6);
color: #fff;
}
.name-badge {
bottom: 24rpx;
background: #fff1d2;
color: #333;
}
.st-right {
flex: 1;
position: relative;
}
.star {
right: 8rpx;
/* top: -12rpx; */
display: flex;
justify-content: flex-end;
translate: 0 -40%;
}
.star-icon {
width: 58rpx;
height: 58rpx;
}
.desc {
font-size: 28rpx;
color: #333;
line-height: 44rpx;
}
.tag-list {
margin-top: 20rpx;
display: flex;
flex-wrap: wrap;
}
.tag {
padding: 6rpx 16rpx;
border: 2rpx solid #C52733;
color: #C52733;
border-radius: 100rpx;
font-size: 24rpx;
margin-right: 16rpx;
margin-top: 12rpx;
}
.mainImage-wap{
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
// transform: translate(-50%, -50%);
}
.gg-box{
border: 2rpx solid #FADE9F;
border-radius: 22rpx;
position: absolute;
width: 160rpx;
bottom: 12rpx;
left: 0;
right: 0;
margin: auto;
text-align: center;
background: rgba(0,0,0,0.3);
}
.gg{
border-radius: 120rpx;
background: #FADE9F;
padding: 6rpx 5rpx;
color: #333;
margin-top: -28rpx;
}
</style>