mrr.sj.front/pages/groupBuy/detail.vue

1363 lines
34 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="detail-page">
<!-- 使用自定义导航栏 -->
<custom-navbar title="服务详情" :show-back="true" :showUser="false" titleColor="#000" :show-headle="true"
headleSrc="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/3b04f0c1-a55e-4658-9de5-22175cce9bbc.png"
@onHeadleClick="goInvite"></custom-navbar>
<!-- 主图区域 banner -->
<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 v-if="serviceInfo.video">
<video :src="serviceInfo.video" v-if="serviceInfo.video && showVideo" id="myVideo"
class="banner-image" :autoplay="true" :controls="false" :muted="isMuted"
:enable-progress-gesture="false" :loop="true" object-fit="cover">
</video>
<view class="video-controls">
<!-- <view class="control-btn" @click="togglePlay">
<image :src="isPlaying ? '/static/images/pause.png' : '/static/images/play.png'" class="control-icon"></image>
</view> -->
<view class="control-btn" @click="toggleMute">
<image :src="isMuted ? '/static/images/mute.png' : '/static/images/unmute.png'"
class="control-icon"></image>
</view>
</view>
<text class="banner-tag">{{1}}/{{serviceInfo.photo.length + 1}}</text>
</swiper-item>
<swiper-item v-for="(item, index) in serviceInfo.photo" :key="index"
@click="previewImage(serviceInfo.photo, index)">
<image :src="item" mode="aspectFill" class="banner-image" referrer="no-referrer"></image>
<text class="banner-tag"
v-if="serviceInfo.video">{{index+2}}/{{serviceInfo.photo.length + 1}}</text>
<text class="banner-tag" v-else>{{index+1}}/{{serviceInfo.photo.length}}</text>
</swiper-item>
</swiper>
</view>
<!-- 服务信息 -->
<view class="service-pinTuan">
<view class="service-pinTuan-price" v-if="serviceInfo.team_buy">
<text class="service-pinTuan-price-text1">拼团价</text>
<text class="service-pinTuan-price-text2"><text
style="font-size: 24rpx;">¥</text>{{serviceInfo.team_buy.price}}</text>
<view class="service-pinTuan-price-text3">
<image :mode="`aspectFill`" src="@/static/images/shop/pintuan/jiantou2.png"
class="service-pinTuan-price-text3-img"></image>
立省{{ formatPriceNumber(serviceInfo.server_price-serviceInfo.team_buy.price) }}元
</view>
</view>
<view class="service-pinTuan-title">
{{ serviceInfo.title }}
</view>
</view>
<!-- 下单选择 -->
<serviceRadio v-model="serviceType" v-if="serviceInfo.server_kind == 2 && syrCount>0" style="margin-top: 20rpx;"></serviceRadio>
<selectAdress v-if="serviceType ==1 && serviceInfo.server_kind == 2" :id="serviceInfo.id"
:serviceInfo="serviceInfo"></selectAdress>
<selectSyrAdress v-if="serviceType ==1 && serviceInfo.server_kind == 1" :id="serviceInfo.id"
:serviceInfo="serviceInfo"></selectSyrAdress>
<view class="service-info">
<view class="service-shop" v-if="serviceInfo.server_kind == 2">
<view class="shop-info">
<image class="shop-logo" :src="serviceInfo.shop_head_photo" mode="aspectFill"
@click="goShopHome(serviceInfo.publish_user_id)"></image>
<view class="shop-info-you">
<text class="shop-name">{{serviceInfo.shop_name}}</text>
<view class="stars"></view>
<view class="shop-class-w">
<text class="shop-class">主营:{{serviceInfo.shop_class.substr(1)}}</text>
</view>
<view class="shop-time" style="width:480rpx">
<text class="shop-class">营业时间:{{serviceInfo.shop_business_time}}</text>
</view>
</view>
</view>
<view class="shop-cont">
<view class="shop-cont-left">
<view>
<text
class="shop-address">{{serviceInfo.shop_dependency}}{{serviceInfo.shop_address}}</text>
</view>
<view>
<text class="shop-tell">电话:{{serviceInfo.phone}}</text>
</view>
<!-- <text class="shop-distance">距您4.2km</text> -->
</view>
<view class="shop-cont-right">
<image src="/static/images/go_map.png" class="shop-headle" mode="aspectFit" @click="openMap">
</image>
<image src="/static/images/go_phone.png" class="shop-headle" mode="aspectFit"
@click="goContact(serviceInfo.phone)"></image>
</view>
</view>
</view>
</view>
<evaluationList :order_shop_id="serviceInfo.id" :order_shop_type="1" v-if="serviceInfo.id" @goList="goList">
</evaluationList>
<!-- 手艺人区域 -->
<view class="service-syr" v-if="serviceInfo.server_kind == 1">
<image class="syr-head" v-if="syrInfo.head_photo" :src="syrInfo.head_photo" mode="aspectFill"></image>
<view class="syr-info">
<text class="syr-name">{{syrInfo.name}}</text>
</view>
<view class="look-btn" @click="goSyrHome(serviceInfo.publish_user_id)">
<text class="look-text">进入逛逛</text>
</view>
</view>
<!-- 项目说明 -->
<view class="notice-section">
<view class="section-title">
<text class="section-tit">项目说明</text>
</view>
<view class="notice-content">
<view class="notice-cont">
<text class="notice-title">
服务时长:
</text>
<text class="notice-text">
{{serviceInfo.server_time}}分钟
</text>
</view>
<view class="notice-cont" v-for="(item,i) in serviceInfo.detail">
<text class="notice-title">
{{item.title}}
</text>
<text class="notice-text">
{{item.text}}
</text>
</view>
</view>
</view>
<!-- 图文详情 -->
<imgAndText v-if="serviceInfo.graphic_details" :info="serviceInfo.graphic_details"></imgAndText>
<!-- 步骤 -->
<view class="notice-section">
<view class="section-title">
<text class="section-tit">项目步骤</text>
</view>
<view class="notice-content">
<view class="notice-cont" v-for="(item,i) in serviceInfo.process">
<text class="notice-title">
{{item.title}}
</text>
<text class="notice-text">
{{item.text}}
</text>
</view>
</view>
</view>
<!-- 订购须知 -->
<view class="notice-section">
<view class="section-title">
<text class="section-tit">订购须知</text>
<!-- <view class="section-tit-right">
<text class="rule-text">取消、退款、赔付规则</text>
<image src="/static/images/arrow_right.png" class="enter-icon" mode="aspectFit"></image>
</view> -->
</view>
<view class="notice-content">
<text class="notice-text">
{{serviceInfo.purchasenotes}}
</text>
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-bar">
<!-- <view class="lianxi" @click="goContact(serviceInfo.phone)">
<image src="/static/images/tell_icon.png" class="lianxi-icon" mode=""></image>
<text class="lianxi-text">联系TA</text>
</view> -->
<view class="bottom-bar__tip" v-if="serviceInfo.team_buy">
已拼{{serviceInfo.team_buy.pay_person_num}}人,还差{{serviceInfo.team_buy.person_num - serviceInfo.team_buy.pay_person_num}}人即可成团!
</view>
<view class="submit-btn" @click="submitOrder(true)"
:class="syrInfo.order_taking == 2 || sjInfo.order_taking == 2 ? 'cannot-submit' : ''">
<text class="btn-price" style="font-size: 38rpx;"><text
style="font-size: 24rpx;">¥</text>{{ serviceInfo.server_price}}</text>
<text class="btn-price">直接购买</text>
</view>
<view class="submit-btn2" @click="submitOrder(false)"
:class="syrInfo.order_taking == 2 || sjInfo.order_taking == 2 ? 'cannot-submit' : ''"
v-if="serviceInfo.team_buy">
<text class="btn-price" style="font-size: 38rpx;"><text
style="font-size: 24rpx;">¥</text>{{ serviceInfo.team_buy.price }}</text>
<text class="btn-price">{{serviceInfo.team_buy.person_num}}人团专享</text>
</view>
</view>
<!-- 获取权限提示匡内容 -->
<view class="permission" :class="{ transform: isShowPer }">
<text class="per-tit">美融融plus 对拨打电话权限申请说明</text>
<text class="per-cont">当您需要联系商家或平台客服的时候,需要获取拨打电话权限。</text>
</view>
<l-painter ref="painter" hidden
css=" width: 420rpx; height: 336rpx;position: relative;background-image:url(https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/8b8dd83f-ccde-406a-b236-2cf27db682e0)"
v-if="serviceInfo.team_buy && serviceInfo.team_buy.id">
<l-painter-image :src="serviceInfo.photo[0]"
css=" width: 205rpx; height: 205rpx; position: absolute;left:34rpx;top:108rpx;z-index:2;border-radius:20rpx;object-fit:cover" />
<l-painter-view css="display: inline-block;z-index:2;position: absolute;left:255rpx;top:108rpx;">
<l-painter-view
css="display: inline-block;vertical-align: middle;background:rgba(253, 218, 226, 1);border-radius: 17rpx 17rpx 17rpx 0rpx;padding: 6rpx 10rpx;">
<l-painter-image
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/8406740b-0448-447e-8d61-df91f1339bd4"
css=" width: 14rpx;height: 19rpx;" />
<l-painter-text
:text="`立省${formatPriceNumber(this.serviceInfo.server_price-this.serviceInfo.team_buy.price)}元`"
:css="`font-weight: 500;font-size: ${formatPriceSize(
formatPriceNumber(this.serviceInfo.server_price-this.serviceInfo.team_buy.price),
18,
2
)}rpx;color: #E8101E;line-height: 25rpx;text-align: left;font-style: normal;`" />
</l-painter-view>
<l-painter-view css="margin-top:44rpx;">
<l-painter-text text="¥"
css="font-weight: 500;font-size: 26rpx;color: #E8101E;line-height: 48rpx;text-align: left;font-style: normal;" />
<l-painter-text :text="formatPriceNumber(this.serviceInfo.team_buy.price)" :css="`font-weight: 500;font-size:${formatPriceSize(
formatPriceNumber(this.serviceInfo.team_buy.price),
56,
3
)}rpx;color: #E8101E;line-height: 34rpx;text-align: left;font-style: normal;`" />
</l-painter-view>
<l-painter-view css="margin-top:0rpx;">
<l-painter-text :text="`原价¥${formatPriceNumber(this.serviceInfo.server_price)}`" :css="`text-decoration: line-through;font-weight: 400;font-size:${formatPriceSize(
formatPriceNumber(this.serviceInfo.server_price),
24,
4
)}rpx;color: #CACCCC;line-height: 33rpx;text-align: left;font-style: normal;`" />
</l-painter-view>
<l-painter-view
css="width: 143rpx; height: 50rpx;background-image:url(https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/c4f3c552-67f2-4b1e-9aeb-ab8c4cf1c97e);display: inline-block;border-radius: 25rpx;">
</l-painter-view>
</l-painter-view>
</l-painter>
<selfPay ref="selfPayRef" :show="showPay" @change="e=>showPay=e.show" :serviceInfo="serviceInfo" :serviceType="serviceType" :isOriginalPrice="isOriginalPrice">
</selfPay>
</view>
</template>
<script>
import {
handleImgSize,
handleImgSizeUni
} from '@/utils/service.js'
import request from '../../utils/request'
import CustomNavbar from '@/components/custom-navbar/custom-navbar.vue'
import _public from '../../utils/public'
import locationService from '../../utils/locationService';
import permissionUtils from '../../utils/per'
import evaluationList from '@/pages/evaluate/components/evaluationList'
import imgAndText from '@/pages/service/components/imgAndText'
import serviceRadio from '@/pages/service/components/service-radio';
import selectAdress from '@/pages/service/components/select-adress';
import selectSyrAdress from '@/pages/service/components/select-syr-adress';
import selfPay from '@/pages/service/components/self-pay'
export default {
components: {
CustomNavbar,
evaluationList,
imgAndText,
serviceRadio,
selectAdress,
selectSyrAdress,
selfPay
},
data() {
return {
isOriginalPrice:true,
syrCount: 0,
isSubmit: false,
showPay: false,
serviceType: 2,
isShowPer: false,
showVideo: false,
time: '12:30',
date: '今天',
isMuted: true,
serviceInfo: {
"id": null,
"title": null,
"server_price": null,
"server_time": null,
"line_price": null,
"sales_num": 0,
"photo": [],
"video": null,
"first_class_id": null,
"second_class_id": null,
"detail": [],
"process": [],
"purchase_notes": null,
"publish_user_id": null,
"server_kind": null,
"state": null,
"add_time": null,
"approve_user_id": null,
"approve_time": null,
"is_hot": null,
"is_delete": null,
"doorto_price": null,
"team_buy": {
"price": null,
"person_num": null
}
},
syrInfo: {},
sjInfo: {},
videoContext: null,
// 评价
comments: [{
userName: '山河*明月',
avatar: '/static/images/avatar1.jpg',
time: '2024-01-20',
content: '工作非常专业,态度很好,第一次来,非常满意,下次还会来',
images: ['/static/images/comment1.jpg', '/static/images/comment2.jpg'],
tab: '超出期待',
type: '双色法式美甲'
}]
}
},
onLoad(option) {
//清除选择的信息
this.$store.commit("clearServiceState")
let _that = this
// Android可能需要延迟加载
request.post('/user/serverdetail', {
id: option.id
}).then(res => {
console.log(res)
if (res.data.server_kind == 1) {
this.getSyrDetail(res.data.publish_user_id)
this.serviceType = 1
} else if (res.data.server_kind == 2) {
this.getSjDetail(res.data.publish_user_id)
// this.getSyr(option.id)
}
this.$nextTick(() => {
this.serviceInfo = res.data;
if (!this.serviceInfo.team_buy) {
_that.pageRedirect(option.id)
}
});
}).catch((err) => {
_that.pageRedirect(option.id)
})
},
computed: {
userAdrees() {
return uni.getStorageSync("userAdrees").addressRes || getApp().globalData.addressRes;
}
},
mounted() {
this.videoContext = uni.createVideoContext('myVideo', this); // 绑定 video 实例
},
onShow() {
this.showVideo = true;
if(this.$refs.selfPayRef){
this.$refs.selfPayRef.clearSubmit()
}
},
onHide() {
this.showVideo = false;
},
methods: {
//跳转评论列表
goList() {
uni.navigateTo({
url: `/pages/evaluate/evaluationList?order_shop_id=${this.serviceInfo.id}&order_shop_type=1`
})
},
pageRedirect(id) {
uni.redirectTo({
url: `/pages/service/detail?id=${id}` // 要跳转到的目标页面路径
});
},
async goInvite() {
this.$refs.painter.canvasToTempFilePathSync({
fileType: "jpg",
// 如果返回的是base64是无法使用 saveImageToPhotosAlbum需要设置 pathType为url
pathType: 'url',
quality: 1,
success: async (res) => {
let imageUrl =
'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40'
try {
// 直接调用导入的函数,不要加 this
const processedUrl = await handleImgSizeUni(res.tempFilePath);
console.log("处理后的图片地址:", processedUrl);
// 赋值给组件数据
imageUrl = processedUrl;
} catch (err) {
console.error("处理失败:", err);
}
uni.share({
provider: "weixin",
scene: "WXSceneSession",
type: 5,
title: `我发现个不错的服务,拼单立省${this.formatPriceNumber(this.serviceInfo.server_price - this.serviceInfo.team_buy.price)}`,
miniProgram: {
id: 'gh_89c92e18b70b', // 小程序原始ID
path: `/subPackages/groupBuy/detail?id=${this.serviceInfo.id}`, //小程序路径
type: this.$store.state.wxShareType, // 正式版:0测试版:1体验版:2
webUrl: "https://www.baidu.com/",
},
// href:"https://www.baidu.com/",
imageUrl: imageUrl, // 分享主图建议300*300以上
success: function(res) {
console.log("success:" + JSON.stringify(res));
},
fail: function(err) {
uni.share({
provider: "weixin",
scene: "WXSceneSession",
type: 5,
title: `我发现个不错的服务,拼单立省${this.formatPriceNumber(this.serviceInfo.server_price - this.serviceInfo.team_buy.price)}`,
miniProgram: {
id: 'gh_89c92e18b70b', // 小程序原始ID
path: `/subPackages/groupBuy/detail?id=${this.serviceInfo.id}`, //小程序路径
type: this.$store.state
.wxShareType, // 正式版:0测试版:1体验版:2
webUrl: "https://www.baidu.com/",
},
// href:"https://www.baidu.com/",
imageUrl: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/yh/1756713709528-717.png?x-oss-process=image/resize,p_40,', // 分享主图建议300*300以上
success: function(res) {
console.log("success:" + JSON.stringify(
res));
},
fail: function(err) {
console.log("fail:" + JSON.stringify(err));
}
});
}
});
},
});
},
goAddressList() {
uni.navigateTo({
url: '/pages/address/list?select=true'
})
},
// 获取店铺或者手艺人详情
getSyrDetail(id) {
request.post('/user/syrdetail', {
id
}).then(res => {
this.syrInfo = res.data;
this.$store.commit("setreservationSyr", res.data);
}).catch(err => {
console.log(err)
})
},
// 获取店铺详情
getSjDetail(id) {
request.post('/user/sjdetail', {
id
}).then(res => {
this.sjInfo = res.data;
this.$store.commit("setSelectStore", res.data);
}).catch(err => {
console.log(err)
})
},
getSyr(id) {
let queryData = {
limit: 1,
page: 1,
name: "",
id: id,
servers_region: "",
city: this.userAdrees.cCode
}
request.post("/user/servers/syrList", queryData).then((res) => {
if (res.code == 200) {
this.syrCount = res.data.count;
}
}).finally(() => {});
},
// 跳转店铺详情
goShopHome(id) {
uni.navigateTo({
url: '/pages/user/store-detail?id=' + id
})
},
// 跳转手艺人详情
goSyrHome(id) {
uni.navigateTo({
url: '/pages/user/syr-detail?id=' + id
})
},
// 开启或关闭声音
toggleMute() {
this.isMuted = !this.isMuted;
},
previewImage(urls, current) {
uni.previewImage({
urls: urls,
current: current
})
},
submitOrder(isOriginalPrice) {
this.isOriginalPrice = isOriginalPrice
console.log('点击了', isOriginalPrice)
this.isLogin = uni.getStorageSync('accessToken') ? true : false;
if (!this.isLogin) {
uni.showModal({
title: '登录提醒',
content: '您暂未登录,无法预约服务,是否前去登录?',
confirmColor: '#F1AC66',
success(e) {
if (e.confirm) {
// uni.oprPresentLogin()
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
}
}
})
return;
};
if (this.syrInfo.order_taking == 2 || this.sjInfo.order_taking == 2) return;
if (!this.serviceType) {
uni.showToast({
title: "请选择服务类型",
icon: "none",
});
return
}
if (this.serviceType == 1) {
if (Object.keys(this.$store.state.reservationAddress).length == 0) {
uni.showToast({
title: "请选择到家地址",
icon: "none",
});
return
}
if (Object.keys(this.$store.state.reservationSyr).length == 0 && this.serviceInfo.server_kind == 2) {
uni.showToast({
title: "请选择服务人员",
icon: "none",
});
return
}
if (Object.keys(this.$store.state.reservationTime).length == 0) {
uni.showToast({
title: "请选择时间",
icon: "none",
});
return
}
}
this.showPay = true
// uni.navigateTo({
// url: `/pages/groupBuy/submit?id=${this.serviceInfo.id}&isOriginalPrice=${isOriginalPrice}`
// })
},
// 显示权限说明弹窗
showPermissionDialog(title, content) {
return new Promise((resolve) => {
uni.showModal({
title,
content,
confirmText: '去开启',
success(res) {
resolve(res.confirm);
}
});
});
},
async goContact(phone) {
// uni.navigateTo({
// url: '/pages/contact/contact?phone='+this.serviceInfo.phone
// })
const systemInfo = uni.getSystemInfoSync()
if (systemInfo.platform === 'ios') {
uni.makePhoneCall({
phoneNumber: phone //仅为示例
})
} else {
let permission = '';
if (systemInfo.platform === 'ios') {
permission = 'phone'
} else {
permission = 'android.permission.CALL_PHONE'
}
this.isShowPer = true;
const firstRequest = !plus.storage.getItem(`perm_${permission}`)
if (firstRequest) {
this.isShowPer = true;
}
// 1. 检查权限
const {
granted
} = await permissionUtils.checkPermission('phone', '需要拨打电话权限,方便您联系商家或平台');
if (granted) {
this.isShowPer = false;
uni.makePhoneCall({
phoneNumber: phone //仅为示例
})
return;
}
this.isShowPer = false;
// 2. 显示权限说明弹窗
const confirm = await this.showPermissionDialog(
'拨打电话权限申请',
'我们需要拨打电话权限,方便您联系商家或平台'
);
if (!confirm) return;
// 3. 请求权限
const result = await permissionUtils.requestPermission('phone', '需要拨打电话权限,方便您联系商家或平台');
console.log('result', result)
if (result) {
uni.makePhoneCall({
phoneNumber: phone //仅为示例
})
return;
} else {
locationService.openAppSettings();
return;
// uni.showToast({ title: '相机权限被拒绝', icon: 'none' });
}
}
},
// 打开手机已有地图
openMap() {
let that = this;
// #ifdef MP-WEIXIN
uni.openLocation({
success: function(res) {
console.log('打开系统位置地图成功');
},
fail: function(error) {
console.log(error);
}
});
// #endif
// #ifdef APP-PLUS
_public.goMap({
latitude: parseFloat(that.serviceInfo.latitude),
longitude: parseFloat(that.serviceInfo.longitude),
name: that.serviceInfo.shop_name,
address: that.serviceInfo.shop_address
})
// #endif
},
}
}
</script>
<style>
.detail-page {
padding-bottom: 120rpx;
}
/* 主图区域 */
.main-image-section {
position: relative;
width: 750rpx;
height: 750rpx;
background-color: #999;
}
.banner-swiper {
width: 750rpx;
height: 750rpx;
}
.banner-image {
width: 750rpx;
height: 750rpx;
}
.banner-tag {
font-size: 20rpx;
font-weight: 500;
color: #FFFFFF;
padding: 6rpx 12rpx;
background-color: rgba(0, 0, 0, 0.40);
position: absolute;
border-radius: 20rpx;
right: 26rpx;
bottom: 28rpx;
}
/* 服务信息 */
.service-pinTuan {
padding: 0 28rpx;
margin-top: 21rpx;
}
.service-pinTuan-price {
height: 93rpx;
background: rgba(232, 16, 30, 1);
border-radius: 16rpx 16rpx 0 0;
display: flex;
flex-direction: row;
align-items: center;
padding-left: 32rpx;
}
.service-pinTuan-price-text1 {
font-weight: 500;
font-size: 26rpx;
color: #FFFFFF;
line-height: 33rpx;
text-align: left;
font-style: normal;
margin-right: 10rpx;
}
.service-pinTuan-price-text2 {
font-weight: 500;
font-size: 52rpx;
color: #FFFFFF;
line-height: 73rpx;
text-align: left;
font-style: normal;
margin-right: 22rpx;
}
.service-pinTuan-price-text3 {
display: flex;
align-items: center;
flex-direction: row;
padding: 5rpx 10rpx;
background: #FFFFFF;
border-radius: 6rpx;
font-weight: 500;
font-size: 24rpx;
color: rgba(232, 16, 30, 1);
line-height: 33rpx;
text-align: left;
font-style: normal;
}
.service-pinTuan-price-text3-img {
margin-right: 10rpx;
width: 18rpx;
height: 25rpx;
}
.service-pinTuan-title {
display: flex;
align-items: center;
height: 87rpx;
background: #FFFFFF;
border-radius: 10rpx;
font-weight: 500;
font-size: 36rpx;
color: #333333;
line-height: 50rpx;
text-align: left;
font-style: normal;
padding-left: 30rpx;
}
.user-choice,
.comments-section,
.notice-section {
background-color: #fff;
padding: 24rpx;
box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.05);
margin: 0 24rpx 24rpx;
border-radius: 16rpx;
}
.service-info {
margin: 20rpx 24rpx;
background-color: #fff;
box-shadow: 0 0 12rpx 0 rgba(0, 0, 0, 0.05);
padding-top: 24rpx;
border-radius: 16rpx;
}
.service-price {
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
margin-bottom: 18rpx;
padding: 0 24rpx;
}
.price-symbol {
font-size: 24rpx;
color: #E8101E;
font-weight: 500;
margin-right: 2rpx;
}
.price-value {
font-size: 32rpx;
color: #E8101E;
font-weight: 500;
}
.service-title {
margin-bottom: 16rpx;
padding: 0 24rpx;
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: flex-start;
}
.service-type {
font-size: 24rpx;
color: #FFFFFF;
background-color: #FF94B4;
padding: 2rpx 10rpx;
border-radius: 14rpx;
margin-right: 12rpx;
}
.title-text {
flex: 1;
font-size: 26rpx;
color: #333333;
font-weight: 500;
}
.service-tabs {
display: flex;
}
.tab-item {
height: 24rpx;
line-height: 24rpx;
font-size: 16rpx;
color: #999999;
background-color: #FFF2F2;
padding: 0 8rpx;
border-radius: 8rpx;
}
/* 到家地址以及可预约时间 */
.choice-item {
height: 90rpx;
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
}
.choice-tit {
font-size: 24rpx;
color: #999999;
margin-right: 16rpx;
}
.choice-cont {
flex: 1;
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
}
.address-left {
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
}
.choice-text {
font-size: 24rpx;
color: #666666;
}
.address-icon {
width: 24rpx;
height: 24rpx;
margin-right: 8rpx;
}
.enter-icon {
width: 24rpx;
height: 24rpx;
margin-left: 8rpx;
}
/* 手艺人区域 */
.service-syr {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
margin: 0 24rpx 24rpx;
background-color: #fff;
box-shadow: rgba(0, 0, 0, 0.05);
padding: 24rpx;
}
.syr-head {
width: 104rpx;
height: 104rpx;
border-radius: 54rpx;
margin-right: 10rpx;
}
.syr-info {
flex: 1;
}
.syr-name {
font-size: 28rpx;
color: #3D3D3D;
}
.look-btn {
width: 130rpx;
height: 56rpx;
border: 1rpx solid #E8101E;
display: flex;
flex-flow: row nowrap;
justify-content: center;
align-items: center;
border-radius: 28rpx;
}
.look-text {
font-size: 28rpx;
color: #E8101E;
}
/* 评论区域 */
.section-title {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
}
.section-num {
font-size: 28rpx;
font-weight: 500;
color: #3D3D3D;
}
.look-all {
display: flex;
flex-flow: row nowrap;
justify-content: flex-end;
align-items: center;
}
.look {
font-size: 24rpx;
color: #666666;
}
.comment-item {
padding: 24rpx 0;
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
}
.comment-item:last-child {
padding-bottom: 0rpx;
}
.comment-header {
display: flex;
align-items: center;
margin-bottom: 14rpx;
}
.user-avatar {
width: 64rpx;
height: 64rpx;
border-radius: 32rpx;
margin-right: 14rpx;
background-color: #000;
}
.comment-user-info {
flex: 1;
}
.user-name {
font-size: 28rpx;
color: #3D3D3D;
margin-bottom: 10rpx;
}
.comment-tab {
font-size: 16rpx;
padding: 0 8rpx;
border-radius: 12rpx;
color: #E8101E;
background-color: rgba(255, 148, 180, 0.50);
margin-right: 8rpx;
}
.comment-type {
font-size: 20rpx;
color: #999999;
}
.comment-content {
font-size: 22rpx;
color: #333333;
line-height: 1.5;
}
.comment-images {
width: 154rpx;
height: 154rpx;
background-color: #000;
margin-left: 56rpx;
}
.comment-image {
width: 160rpx;
height: 160rpx;
border-radius: 8rpx;
}
/* 购买须知 */
.section-tit {
font-size: 28rpx;
font-weight: 500;
color: #3D3D3D;
}
.section-tit-right {
display: flex;
flex-flow: row nowrap;
justify-content: flex-end;
align-items: center;
}
.rule-text {
font-size: 28rpx;
color: #D10F13;
}
.notice-item {
margin-bottom: 24rpx;
}
.notice-title {
font-size: 28rpx;
color: #333;
font-weight: 500;
}
.notice-content {
margin-top: 32rpx;
}
.notice-cont {
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: flex-start;
margin-bottom: 16rpx;
}
.notice-cont:last-child {
margin-bottom: 0;
}
.notice-text {
flex: 1;
font-size: 26rpx;
color: #666;
}
/* 底部按钮 */
.bottom-bar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
height: 120rpx;
background-color: #FFFFFF;
display: flex;
flex-flow: row nowrap;
align-items: center;
justify-content: flex-end;
/* padding-bottom: env(safe-area-inset-bottom); */
border-top: 1rpx solid rgba(0, 0, 0, 0.10);
padding: 0 20rpx;
}
.bottom-bar__tip {
position: absolute;
right: 20rpx;
top: -10rpx;
transform: translateY(-100%);
padding-left: 20rpx;
height: 62rpx;
background: #000000;
opacity: 0.7;
font-weight: 400;
font-size: 28rpx;
color: #FFFFFF;
line-height: 40rpx;
text-align: left;
font-style: normal;
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
}
/* 底部中间倒三角:通过伪元素实现 */
.bottom-bar__tip::after {
content: "";
/* 伪元素必须有content空值也可 */
position: absolute;
/* 1. 定位到提示框底部中间 */
bottom: -10rpx;
/* 三角完全在提示框外部(值=三角高度) */
left: 60%;
transform: translateX(-50%);
/* 水平居中抵消left:50%的偏移) */
/* 2. 生成倒三角利用border的透明+有色组合 */
border-width: 10rpx 8rpx 0;
/* 上边框=三角高度,左右边框=三角宽度,下边框=0 */
border-style: solid;
/* 3. 颜色匹配:三角背景色=提示框背景色,其他方向透明 */
border-top-color: #000;
/* 与提示框background一致 */
border-left-color: transparent;
border-right-color: transparent;
border-bottom-color: transparent;
/* 4. 优化:避免三角遮挡点击(可选) */
pointer-events: none;
/* 5. 透明度匹配与提示框opacity一致 */
}
.lianxi {
display: flex;
flex-flow: column nowrap;
justify-content: center;
align-items: center;
}
.lianxi-text {
font-size: 16rpx;
color: #666666;
}
.lianxi-icon {
width: 34rpx;
height: 34rpx;
margin-bottom: 10rpx;
}
.submit-btn {
display: flex;
flex-direction: column;
padding: 0 20rpx;
height: 104rpx;
background: rgba(232, 16, 30, 0.6);
border-radius: 10rpx 0rpx 0rpx 10rpx;
align-items: center;
justify-content: center;
}
.submit-btn2 {
display: flex;
flex-direction: column;
padding: 0 72rpx;
height: 104rpx;
background: rgba(232, 16, 30, 1);
border-radius: 0rpx 10rpx 10rpx 0rpx;
align-items: center;
justify-content: center;
}
.btn-price {
font-weight: 400;
font-size: 34rpx;
color: #FFFFFF;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
.cannot-submit {
background-color: #999999;
}
.service-shop {}
.shop-info {
display: flex;
flex-flow: row nowrap;
justify-content: flex-start;
align-items: center;
padding: 0 24rpx 16rpx;
border-bottom: 1rpx solid rgba(0, 0, 0, 0.05);
}
.shop-logo {
width: 112rpx;
height: 136rpx;
background-color: #000;
margin-right: 20rpx;
}
.shop-info-you {
flex: 1;
display: flex;
flex-flow: column wrap;
justify-content: space-between;
align-items: flex-start;
flex-wrap: wrap;
flex-direction: row;
}
.shop-name {
width: 480rpx;
font-size: 28rpx;
color: #3D3D3D;
margin-bottom: 10rpx;
}
.shop-class-w {
width: 480rpx;
}
.shop-class {
margin-bottom: 8rpx;
}
.shop-class,
.shop-time {
font-size: 24rpx;
color: #666666;
}
.shop-cont {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
align-items: center;
padding: 16rpx 24rpx;
}
.shop-cont-left {
display: flex;
flex-flow: column wrap;
justify-content: space-between;
align-items: flex-start;
}
.shop-cont-right {
display: flex;
flex-flow: row nowrap;
justify-content: flex-end;
align-items: center;
}
.shop-address,
.shop-tell {
width: 450rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #333333;
}
.shop-distance {
font-size: 24rpx;
color: #666666;
}
.shop-headle {
width: 40rpx;
height: 40rpx;
margin-left: 60rpx;
}
.video-controls {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 100rpx;
display: flex;
align-items: flex-start;
justify-content: center;
z-index: 3;
}
.control-btn {
width: 60rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.5);
border-radius: 30rpx;
margin: 0 20rpx;
}
.control-icon {
width: 40rpx;
height: 40rpx;
}
/* H5适配 */
/* #ifdef H5 */
.bottom-bar {
padding-bottom: 0;
}
/* #endif */
/* APP适配 */
/* #ifdef APP-PLUS */
.detail-page {
padding-bottom: 188rpx;
}
.permission.transform {
top: 180rpx;
opacity: 1;
visibility: visible;
}
/* #endif */
/* 小程序适配 */
/* #ifdef MP-WEIXIN */
.custom-navbar {
background: linear-gradient(180deg, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0) 100%);
}
/* #endif */
</style>