Merge branch 'mrr_sj_develop_hjy_20260520_商家改版' of https://gitee.com/qtvbidt/mrr.sj.front into mrr_sj_develop_hjy_20260520_商家改版

This commit is contained in:
BAKEYi 2026-06-04 11:51:32 +08:00
commit 89d53394f1
5 changed files with 2125 additions and 1763 deletions

View File

@ -1,22 +1,20 @@
<template>
<view class="brand-card-comp" @click="onClick">
<image class="brand-bg" :src="item.bgSrc" mode="aspectFill"></image>
<image class="mask-bg" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/9bca353c-fa74-407e-a69e-6f5e9aa43955.png" mode="widthFix"></image>
<image class="mask-bg"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/9bca353c-fa74-407e-a69e-6f5e9aa43955.png"
mode="widthFix"></image>
<view class="card-content">
<view class="avatar-wrapper" style="border-color: #F7E5D7;">
<image class="avatar-img" :src="item.avatar || 'https://dummyimage.com/100x100/ccc/fff.png&text=logo'"></image>
<image class="avatar-img" :src="item.avatar || 'https://dummyimage.com/100x100/ccc/fff.png&text=logo'">
</image>
</view>
<text class="brand-name">{{ item.name }}</text>
<view class="tags-container">
<view
class="tag-item"
v-for="(tag, idx) in displayTags"
:key="idx"
:style="getTagStyle(tag)"
>
<view class="tag-item" v-for="(tag, idx) in displayTags" :key="idx" :style="getTagStyle(tag)">
<image class="tag-icon" v-if="tag.icon" :src="tag.icon"></image>
<text class="tag-text">{{ tag.text }}</text>
</view>
@ -84,7 +82,15 @@ export default {
// 1. emit便
this.$emit('click', this.item);
// 2.
// 2.
if (!uni.getStorageSync("accessToken")) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return;
}
// 3.
if (this.item && this.item.id) {
uni.navigateTo({
url: `/pages/jingxuan/brand-detail?id=${this.item.id}`
@ -128,6 +134,7 @@ export default {
overflow: hidden;
background-color: #fff;
}
.brand-bg {
width: 100%;
height: 184rpx;
@ -136,6 +143,7 @@ export default {
left: 0;
z-index: 1;
}
.mask-bg {
width: 100%;
height: 251rpx;
@ -145,6 +153,7 @@ export default {
z-index: 2;
display: block;
}
.card-content {
position: absolute;
bottom: 0;
@ -156,6 +165,7 @@ export default {
align-items: center;
padding-bottom: 24rpx;
}
.avatar-wrapper {
width: 80rpx;
height: 80rpx;
@ -169,10 +179,12 @@ export default {
margin-top: -38rpx;
margin-bottom: 12rpx;
}
.avatar-img {
width: 100%;
height: 100%;
}
.brand-name {
font-size: 24rpx;
font-weight: 500;
@ -180,6 +192,7 @@ export default {
line-height: 34rpx;
margin-bottom: 12rpx;
}
.tags-container {
display: flex;
justify-content: center;
@ -187,6 +200,7 @@ export default {
gap: 20rpx;
flex-wrap: wrap;
}
.tag-item {
display: flex;
align-items: center;
@ -196,12 +210,14 @@ export default {
background-color: transparent;
padding: 7rpx 12rpx;
}
.tag-icon {
width: 24rpx;
height: 22rpx;
margin-right: 6rpx;
flex-shrink: 0;
}
.tag-text {
font-size: 20rpx;
line-height: 28rpx;

View File

@ -2,10 +2,8 @@
<view class="skill-item" @click="handleClick">
<view class="cover-box">
<image class="cover" :src="item.coverSrc" mode="aspectFill"></image>
<image
class="play-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/5c1ddfef-a200-424a-a9dc-03d9395568f6.png"
></image>
<image v-if="item.video" class="play-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/5c1ddfef-a200-424a-a9dc-03d9395568f6.png"></image>
</view>
<view class="skill-info">
<view class="skill-title line-2">{{ item.title }}</view>
@ -14,10 +12,9 @@
<text class="type-text">{{ item.type || '平台课程' }}</text>
</view>
<view class="skill-stats">
<image
class="view-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/2409b64a-56bb-4d9e-a4cc-5b3444fcf097.png"
></image>
<image class="view-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/2409b64a-56bb-4d9e-a4cc-5b3444fcf097.png">
</image>
{{ formatViews(item.views) }}观看 · {{ item.time }}
</view>
</view>
@ -69,13 +66,20 @@ export default {
// 1. emit便
this.$emit('click', this.item);
// 2.
// 2.
if (!uni.getStorageSync("accessToken")) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return;
}
// 3.
if (this.item && this.item.id) {
uni.navigateTo({
url: `/pages/jingxuan/skill-detail?id=${this.item.id}`
});
}
// /
}
}
}
@ -188,5 +192,4 @@ export default {
-webkit-line-clamp: 2;
overflow: hidden;
}
</style>

View File

@ -1,6 +1,8 @@
<template>
<view class="homePage">
<image class="page-bg" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/0901dc51-ff5a-427f-aab1-993d80aced79.png" mode="widthFix"></image>
<image class="page-bg"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/0901dc51-ff5a-427f-aab1-993d80aced79.png"
mode="widthFix"></image>
<view class="header-section">
<view class="user-info" @tap="handleLoginRedirect">
@ -11,7 +13,8 @@
</view>
</view>
<view class="status-toggle" :class="{ 'is-closed': !isOpenStore }" @tap="toggleStatus" v-if="isLogin && isSettled">
<view class="status-toggle" :class="{ 'is-closed': !isOpenStore }" @tap="toggleStatus"
v-if="isLogin && userInfo.id_type > 0">
<text class="status-text">{{ isOpenStore ? '营业中' : '休息中' }}</text>
<view class="toggle-dot"></view>
</view>
@ -19,7 +22,9 @@
<view class="setup-modal-mask" v-if="showSetupModal" catchtouchmove="true">
<view class="setup-modal-content">
<image class="modal-bg" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ac2cb4aa-a7c5-4776-98f4-b77e9c0cfa85.png"></image>
<image class="modal-bg"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ac2cb4aa-a7c5-4776-98f4-b77e9c0cfa85.png">
</image>
<view class="modal-header">
<text>温馨提示</text>
@ -31,7 +36,9 @@
<view class="missing-list">
<view class="missing-item" v-if="!hasBusinessTime">
<view class="item-left">
<image class="item-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png"></image>
<image class="item-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png">
</image>
<view class="item-texts">
<text class="item-title">营业时间未配置</text>
<text class="item-desc">请完善店铺的营业时间</text>
@ -42,7 +49,9 @@
<view class="missing-item" v-if="!hasServiceSkill">
<view class="item-left">
<image class="item-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png"></image>
<image class="item-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png">
</image>
<view class="item-texts">
<text class="item-title">服务技能未配置</text>
<text class="item-desc">请完善服务技能</text>
@ -53,10 +62,13 @@
<view class="missing-item" v-if="!isCertified">
<view class="item-left">
<image class="item-icon" :src="isUnderReview ? 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/25c444be-a66e-45d6-b50d-922149ff059f.png' : 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png'"></image>
<image class="item-icon"
:src="isUnderReview ? 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/25c444be-a66e-45d6-b50d-922149ff059f.png' : 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/21b26b44-5e36-4291-8900-705a3d5bfa90.png'">
</image>
<view class="item-texts">
<!-- 只有在审核中时赋予蓝色样式 blue-text -->
<text class="item-title" :class="{'blue-text': isUnderReview}">{{ isUnderReview ? '资质认证中' : '资质未认证' }}</text>
<text class="item-title" :class="{ 'blue-text': isUnderReview }">{{ isUnderReview ?
'资质认证中' : '资质未认证' }}</text>
<text class="item-desc">请完成资质认证</text>
</view>
</view>
@ -75,7 +87,8 @@
</view>
<view class="settlement-guide card-box" v-if="isLogin && isUserInfoLoaded && !isCertified">
<view class="guide-header" :style="{ backgroundImage: 'url(' + (isSettled ? 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/c3a6cdd8-0447-4b50-a8cc-7bab1eedb502.png' : 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/138ccbc3-486d-4287-b67f-f809de99e408.png') + ')' }">
<view class="guide-header"
:style="{ backgroundImage: 'url(' + (isSettled ? 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/c3a6cdd8-0447-4b50-a8cc-7bab1eedb502.png' : 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/138ccbc3-486d-4287-b67f-f809de99e408.png') + ')' }">
<view class="guide-body">
<text class="guide-text">{{ isSettled ? '完成认证,开启您的接单之路' : '入驻美融融,生意更轻松' }}</text>
<view class="guide-btn" @tap="goToSettle">{{ isSettled ? '去认证' : '去入驻' }}</view>
@ -95,9 +108,14 @@
<view class="header-left">
<text class="title">接单管理</text>
<text class="update-time">更新时间{{ orderBasic.updateTime }}</text>
<image class="refresh-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/31c6eebc-5538-4c66-9b32-24dced170a99.png" @tap="fetchOrderNum"></image>
<image class="refresh-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/31c6eebc-5538-4c66-9b32-24dced170a99.png"
@tap="fetchOrderNum"></image>
</view>
<view class="header-right" @tap="goToOrderList">更多数据 <image class="more-right-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png">
</image>
</view>
<view class="header-right" @tap="goToOrderList">更多数据 <image class="more-right-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png"></image></view>
</view>
<view class="stats-content">
<view class="stat-item">
@ -120,28 +138,35 @@
<view class="header-left">
<text class="title">当日实时数据</text>
<text class="update-time">更新时间{{ orderDetail.updateTime }}</text>
<image class="refresh-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/31c6eebc-5538-4c66-9b32-24dced170a99.png" @tap="fetchRealTimeData"></image>
<image class="refresh-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/31c6eebc-5538-4c66-9b32-24dced170a99.png"
@tap="fetchRealTimeData"></image>
</view>
</view>
<view class="detail-content">
<view class="score-dashboard">
<view class="ring-track"></view>
<view class="ring-progress" :style="{'background': progressGradient}"></view>
<view class="ring-progress" :style="{ 'background': progressGradient }"></view>
<view class="dot start-dot" v-if="displayScore > 0"></view>
<view class="dot end-dot" v-if="displayScore > 0" :style="{'transform': `rotate(-${displayScoreDeg}deg) translateY(-67rpx)`}"></view>
<view class="dot end-dot" v-if="displayScore > 0"
:style="{ 'transform': `rotate(-${displayScoreDeg}deg) translateY(-67rpx)` }"></view>
<text class="score-num">{{ displayScore.toFixed(1) }}</text>
<image class="score-tag-img" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/52005bc0-2896-407d-8826-f34539637d20.png" mode="aspectFit"></image>
<image class="score-tag-img"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/52005bc0-2896-407d-8826-f34539637d20.png"
mode="aspectFit"></image>
</view>
<view class="detail-grid">
<view class="grid-item">
<text class="label">访问人数</text>
<view class="val-box"><text class="val">{{ orderDetail.visitors }}</text> <text class="unit"></text></view>
<view class="val-box"><text class="val">{{ orderDetail.visitors }}</text> <text
class="unit"></text></view>
<text class="yesterday">昨日{{ orderDetail.yVisitors }}</text>
</view>
<view class="grid-item">
<text class="label">下单量</text>
<view class="val-box"><text class="val">{{ orderDetail.orders }}</text> <text class="unit"></text></view>
<view class="val-box"><text class="val">{{ orderDetail.orders }}</text> <text
class="unit"></text></view>
<text class="yesterday">昨日{{ orderDetail.yOrders }}</text>
</view>
<view class="grid-item">
@ -157,7 +182,9 @@
</view>
<view class="notice-bar card-box">
<image class="notice-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/75f624b8-a6ed-4787-9380-1a087062805b.png"></image>
<image class="notice-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/75f624b8-a6ed-4787-9380-1a087062805b.png">
</image>
<swiper class="notice-swiper" vertical autoplay circular interval="3000">
<swiper-item v-for="(msg, index) in noticeList" :key="index" @tap="goToNotice(msg)">
<text class="notice-text line-1">{{ msg.title }}</text>
@ -169,31 +196,28 @@
<view class="brands-section card-box">
<view class="card-header">
<view class="header-left"><text class="title" style="margin-left: 10rpx;">精选品牌</text></view>
<view class="header-right" @tap="goToBrandList">更多品牌 <image class="more-right-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png"></image></view>
<view class="header-right" @tap="goToBrandList">更多品牌 <image class="more-right-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png">
</image>
</view>
</view>
<view class="brand-grid">
<brand-card
class="brand-card-wrap"
v-for="(item, index) in brands"
:key="index"
:item="item"
:tagKeys="item.tagKeys"
></brand-card>
<brand-card class="brand-card-wrap" v-for="(item, index) in brands" :key="index" :item="item"
:tagKeys="item.tagKeys"></brand-card>
</view>
</view>
<view class="skills-section card-box">
<view class="card-header">
<view class="header-left"><text class="title">技能集市</text></view>
<view class="header-right" @tap="goToSkillList">更多技能 <image class="more-right-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png"></image> </view>
<view class="header-right" @tap="goToSkillList">更多技能 <image class="more-right-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/ee119e24-1cb2-43df-86e6-61af8e9fd0ad.png">
</image>
</view>
</view>
<view class="skill-list">
<skill-card
v-for="(item, index) in skills"
:key="index"
:item="item"
></skill-card>
<skill-card v-for="(item, index) in skills" :key="index" :item="item"></skill-card>
</view>
</view>
@ -236,16 +260,49 @@ export default {
displayScore: 0,
animationTimer: null,
noticeList: [{ id: 0, title: '', url: '' }],
noticeList: [{
id: 0,
title: '',
url: ''
}],
quickActions: [
{ name: '扫码验券', icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b128e423-e4b5-4ad6-bdf5-522de7a9bc68.png' , path: '/pages/shop/verify/verify-order'},
{ name: '服务管理', icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/a90f02a2-9d39-440a-ad20-a4337bcd1b38.png' , path: '/pages/artisan/service-list'},
{ name: '工位管理', icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/4c503603-6c2f-4a7a-9329-5e54b8ca769e.png' , path: '/pages/shop/workSpace/list'},
{ name: '财务管理', icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/728c659e-e395-4473-b83e-7e04539f7ec6.png' , path: '/pages/wallet/wallet'}
quickActions: [{
name: '扫码验券',
icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/b128e423-e4b5-4ad6-bdf5-522de7a9bc68.png',
path: '/pages/shop/verify/verify-order'
},
{
name: '服务管理',
icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/a90f02a2-9d39-440a-ad20-a4337bcd1b38.png',
path: '/pages/artisan/service-list'
},
{
name: '工位管理',
icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/4c503603-6c2f-4a7a-9329-5e54b8ca769e.png',
path: '/pages/shop/workSpace/list'
},
{
name: '财务管理',
icon: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/728c659e-e395-4473-b83e-7e04539f7ec6.png',
path: '/pages/wallet/wallet'
}
],
orderBasic: { updateTime: '--:--', waitStart: 0, waitFinish: 0, finished: 0 },
orderDetail: { updateTime: '--:--', score: '0.0', visitors: 0, yVisitors: 0, orders: 0, yOrders: 0, amount: '0.00', yAmount: '0.00' },
orderBasic: {
updateTime: '--:--',
waitStart: 0,
waitFinish: 0,
finished: 0
},
orderDetail: {
updateTime: '--:--',
score: '0.0',
visitors: 0,
yVisitors: 0,
orders: 0,
yOrders: 0,
amount: '0.00',
yAmount: '0.00'
},
brands: [],
skills: []
@ -278,9 +335,11 @@ export default {
// 使 authDetails
hasServiceSkill() {
// userInfo
const fromUser = this.userInfo && Array.isArray(this.userInfo.servers_kill) && this.userInfo.servers_kill.length > 0;
const fromUser = this.userInfo && Array.isArray(this.userInfo.servers_kill) && this.userInfo.servers_kill
.length > 0;
// authDetails
const fromAuth = this.authDetails && Array.isArray(this.authDetails.servers_kill) && this.authDetails.servers_kill.length > 0;
const fromAuth = this.authDetails && Array.isArray(this.authDetails.servers_kill) && this.authDetails
.servers_kill.length > 0;
//
return this.isLogin && (fromUser || fromAuth);
@ -378,15 +437,24 @@ export default {
//
formatMoney(amount) {
let num = parseFloat(amount);
if (isNaN(num)) return { val: '0', unit: '元' };
if (isNaN(num)) return {
val: '0',
unit: '元'
};
if (num >= 10000) {
// 10000parseFloat0
let val = parseFloat((num / 10000).toFixed(2));
return { val: val, unit: '万元' };
return {
val: val,
unit: '万元'
};
}
//
return { val: num, unit: '元' };
return {
val: num,
unit: '元'
};
},
//
handleLoginRedirect() {
@ -403,11 +471,15 @@ export default {
},
goToBusinessTime() {
this.showSetupModal = false;
uni.navigateTo({ url: '/pages/shop/business-time' });
uni.navigateTo({
url: '/pages/shop/business-time'
});
},
goToServiceSkill() {
this.showSetupModal = false;
uni.navigateTo({ url: '/pages/shop/service-skills' });
uni.navigateTo({
url: '/pages/shop/service-skills'
});
},
// ( / )
@ -431,10 +503,14 @@ export default {
goToSettle() {
if (!this.isSettled) {
//
uni.navigateTo({ url: '/pages/ruzhu/ruzhu' });
uni.navigateTo({
url: '/pages/ruzhu/ruzhu'
});
} else if (this.isUnderReview) {
//
uni.navigateTo({ url: '/pages/ruzhu/ruzhu?type=1' });
uni.navigateTo({
url: '/pages/ruzhu/ruzhu?type=1'
});
} else {
//
this.navigateToForm();
@ -457,24 +533,47 @@ export default {
},
goToBrandList() {
uni.navigateTo({ url: '/pages/jingxuan/selected-brands' });
if (!this.isLogin) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return
}
uni.navigateTo({
url: '/pages/jingxuan/selected-brands'
});
},
goToSkillList() {
uni.navigateTo({ url: '/pages/jingxuan/selected-skills' });
if (!this.isLogin) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return
}
uni.navigateTo({
url: '/pages/jingxuan/selected-skills'
});
},
// ()
handleQuickAction(item) {
if (item.name === '扫码验券') {
uni.navigateTo({
url: '/pages/shop/verify/verify-order',
fail: (err) => { console.error('跳转失败:', err); }
fail: (err) => {
console.error('跳转失败:', err);
}
});
return;
} // 2.
else if (item.path) {
uni.navigateTo({
url: item.path,
fail: () => { uni.showToast({ title: '页面开发中...', icon: 'none' }); }
fail: () => {
uni.showToast({
title: '页面开发中...',
icon: 'none'
});
}
});
}
},
@ -491,7 +590,7 @@ export default {
getUserInfo() {
request.post("/sj/user/getUser").then((result) => {
if(result.code == 200 && result.data) {
if (result.code == 200 && result.data) {
this.userInfo = result.data;
this.isUserInfoLoaded = true; // UI
uni.setStorageSync("sjId", result.data.id);
@ -532,7 +631,7 @@ export default {
fetchOrderNum() {
request.post("/sj/poster/orderNum").then(res => {
if(res.code == 200 && res.data) {
if (res.code == 200 && res.data) {
this.orderBasic = {
updateTime: this.formatTime(res.data.now_date),
waitStart: res.data.dfw || 0,
@ -546,7 +645,7 @@ export default {
//
fetchRealTimeData() {
request.post("/sj/poster/realTimeData").then(res => {
if(res.code == 200 && res.data) {
if (res.code == 200 && res.data) {
const today = res.data.today || {};
const yesterday = res.data.yesterday || {};
@ -566,8 +665,11 @@ export default {
//
fetchNoticeList() {
request.post('/sj/notice/list', { page: 1, limit: 5 }).then(res => {
if(res.code == 200 && res.data && res.data.list.length > 0) {
request.post('/sj/notice/list', {
page: 1,
limit: 5
}).then(res => {
if (res.code == 200 && res.data && res.data.list.length > 0) {
this.noticeList = res.data.list;
}
});
@ -575,8 +677,11 @@ export default {
//
fetchBrandList() {
request.post('/sj/brand/list', { page: 1, limit: 4 }).then(res => {
if(res.code == 200 && res.data && res.data.list) {
request.post('/sj/brand/list', {
page: 1,
limit: 4
}).then(res => {
if (res.code == 200 && res.data && res.data.list) {
this.brands = res.data.list.map(item => {
let tags = [];
if (item.franchise_state === 1) tags.push('franchise');
@ -586,8 +691,10 @@ export default {
return {
id: item.id,
name: item.name,
bgSrc: item.cover_img || 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/d02b2d8b-0e01-4c6d-bbee-c60dccf4867c.jpg',
avatar: item.logo_img || 'https://dummyimage.com/100x100/ccc/fff.png&text=Avatar',
bgSrc: item.cover_img ||
'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/d02b2d8b-0e01-4c6d-bbee-c60dccf4867c.jpg',
avatar: item.logo_img ||
'https://dummyimage.com/100x100/ccc/fff.png&text=Avatar',
tagKeys: tags
};
});
@ -597,8 +704,11 @@ export default {
//
fetchSkillList() {
request.post('/sj/skill/list', { page: 1, limit: 4 }).then(res => {
if(res.code == 200 && res.data && res.data.list) {
request.post('/sj/skill/list', {
page: 1,
limit: 4
}).then(res => {
if (res.code == 200 && res.data && res.data.list) {
this.skills = res.data.list.map(item => {
return {
id: item.id,
@ -606,8 +716,10 @@ export default {
type: item.link_name || '平台课程',
views: item.browse_num || 0,
time: item.create_time ? item.create_time.split(' ')[0] : '',
coverSrc: item.cover_img || 'https://dummyimage.com/200x150/ccc/fff.png&text=Video',
typeIcon: item.link_logo || ''
coverSrc: item.cover_img ||
'https://dummyimage.com/200x150/ccc/fff.png&text=Video',
typeIcon: item.link_logo || '',
video: item.video || ''
};
});
}
@ -618,15 +730,35 @@ export default {
//
goToNotice(msg) {
if(msg.id) { uni.navigateTo({ url: `/pages/notice/detail?id=${msg.id}` }); }
if (!this.isLogin) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return
}
if (msg.id) {
uni.navigateTo({
url: `/pages/notice/detail?id=${msg.id}`
});
}
},
//
goToNoticeList() {
uni.navigateTo({ url: '/pages/notice/notice_list' });
if (!this.isLogin) {
uni.navigateTo({
url: '/pages/blogPopup/blogPopup'
});
return
}
uni.navigateTo({
url: '/pages/notice/notice_list'
});
},
//
goToOrderList() {
uni.switchTab({ url: '/pages/order/userorder-list' });
uni.switchTab({
url: '/pages/order/userorder-list'
});
},
// /
@ -644,7 +776,10 @@ export default {
let newStatus = currentStatus == 1 ? 2 : 1;
// Loading
uni.showLoading({ title: '切换中...', mask: true });
uni.showLoading({
title: '切换中...',
mask: true
});
//
request.post("/sj/sjordertaking", {
@ -655,11 +790,17 @@ export default {
//
this.userInfo.order_taking = newStatus; //
this.getUserInfo(); //
uni.showToast({ title: newStatus == 1 ? '已开启营业' : '已休息', icon: 'none' });
uni.showToast({
title: newStatus == 1 ? '已开启营业' : '已休息',
icon: 'none'
});
}).catch(() => {
//
uni.hideLoading();
uni.showToast({ title: '网络异常,切换失败', icon: 'none' });
uni.showToast({
title: '网络异常,切换失败',
icon: 'none'
});
});
},
@ -697,14 +838,17 @@ export default {
</script>
<style lang="scss">
page {
page {
background: #f5f6f8;
}
}
/* ============ 提示弹窗样式 ============ */
.setup-modal-mask {
/* ============ 提示弹窗样式 ============ */
.setup-modal-mask {
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 9999;
display: flex;
@ -713,7 +857,8 @@ export default {
.setup-modal-content {
width: 630rpx;
height: 775rpx; /* 根据要求绝对固定宽高 */
height: 775rpx;
/* 根据要求绝对固定宽高 */
background: #FFFFFF;
border-radius: 32rpx;
position: relative;
@ -722,7 +867,8 @@ export default {
.modal-bg {
position: absolute;
top: 0; left: 0;
top: 0;
left: 0;
width: 630rpx;
height: 265rpx;
z-index: 0;
@ -761,7 +907,8 @@ export default {
.missing-list {
display: flex;
flex-direction: column;
gap: 46rpx; /* 间距拉开显得不那么拥挤 */
gap: 46rpx;
/* 间距拉开显得不那么拥挤 */
.missing-item {
display: flex;
@ -776,7 +923,8 @@ export default {
width: 32rpx;
height: 32rpx;
margin-right: 16rpx;
flex-shrink: 0; /* 防止图标被挤压变形 */
flex-shrink: 0;
/* 防止图标被挤压变形 */
margin-top: 6rpx;
}
@ -808,10 +956,18 @@ export default {
font-weight: 400;
margin-top: -45rpx;
&.orange { color: #FF7B00; }
&.grey { color: #999999; }
&.orange {
color: #FF7B00;
}
&.grey {
color: #999999;
}
/* 增加浅绿色样式 */
&.light-green { color: #5CAC81; }
&.light-green {
color: #5CAC81;
}
}
}
}
@ -836,10 +992,11 @@ export default {
}
}
}
}
/* ==================================== */
}
.homePage {
/* ==================================== */
.homePage {
position: relative;
min-height: 100vh;
padding: 0 24rpx;
@ -877,6 +1034,7 @@ export default {
.header-left {
display: flex;
align-items: center;
.title {
margin-right: 20rpx;
font-family: PingFangSC, PingFang SC;
@ -887,6 +1045,7 @@ export default {
text-align: left;
font-style: normal;
}
.update-time {
font-family: PingFangSC, PingFang SC;
font-weight: 400;
@ -895,14 +1054,15 @@ export default {
line-height: 28rpx;
text-align: left;
font-style: normal;
margin-top: -4rpx;
}
.refresh-icon {
width: 18rpx;
height: 18rpx;
margin-left: 10rpx;
}
}
.header-right {
font-weight: 400;
font-size: 20rpx;
@ -922,24 +1082,32 @@ export default {
.user-info {
display: flex;
align-items: center;
.avatar {
width: 96rpx;
height: 96rpx;
width: 76rpx;
height: 76rpx;
border-radius: 50%;
margin-right: 20rpx;
}
.name {
font-weight: 500;
height: 42rpx;
font-family: PingFangTC, PingFangTC;
font-weight: bold;
font-size: 30rpx;
color: #333333;
line-height: 42rpx;
margin-bottom: 8rpx;
}
.desc {
height: 28rpx;
font-family: PingFangTC, PingFangTC;
font-weight: 400;
font-size: 20rpx;
color: #858796;
line-height: 28rpx;
text-align: left;
font-style: normal;
}
}
@ -953,18 +1121,19 @@ export default {
box-sizing: border-box;
overflow: hidden;
background-image: linear-gradient(
316deg,
background-image: linear-gradient(316deg,
rgba(255, 161, 203, 1) 0,
rgba(251, 143, 180, 1) 49.381741%,
rgba(255, 130, 239, 1) 100%
);
rgba(255, 130, 239, 1) 100%);
transition: all 0.3s ease;
&::before {
content: "";
position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url("https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/269c1024-34ec-42af-8b20-1ce047c9851b.png") no-repeat center;
background-size: 100% 100%;
opacity: 0;
@ -999,11 +1168,13 @@ export default {
&::before {
opacity: 1;
}
.status-text {
transform: translateX(46rpx);
}
.toggle-dot {
transform: translate(-113rpx ,2rpx);
transform: translate(-113rpx, 2rpx);
}
}
}
@ -1059,11 +1230,13 @@ export default {
display: flex;
flex-direction: column;
align-items: center;
.action-icon {
width: 60rpx;
height: 60rpx;
margin-bottom: 13rpx;
}
.action-text {
font-weight: 400;
font-size: 24rpx;
@ -1076,13 +1249,15 @@ export default {
}
.order-stats-basic {
background: linear-gradient( 176deg, #F0F4FF 0%, #FFFFFF 100%);
background: linear-gradient(176deg, #F0F4FF 0%, #FFFFFF 100%);
border-radius: 20rpx;
border: 1rpx solid #FFFFFF;
.stats-content {
display: flex;
justify-content: space-around;
text-align: center;
.num {
display: block;
font-weight: 500;
@ -1091,6 +1266,7 @@ export default {
line-height: 56rpx;
font-style: normal;
}
.label {
font-weight: 400;
font-size: 24rpx;
@ -1211,6 +1387,7 @@ export default {
color: #333333;
line-height: 56rpx;
}
.unit {
font-weight: 400;
font-size: 24rpx;
@ -1237,6 +1414,8 @@ export default {
display: flex;
align-items: center;
padding: 13rpx 30rpx;
min-height: 66rpx;
box-sizing: border-box;
background: url("https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/3d9c6b4b-ef6f-4242-abd4-6194d13e02dc.png");
background-size: contain;
@ -1271,6 +1450,7 @@ export default {
.brands-section {
padding: 20rpx 20rpx;
.brand-grid {
display: flex;
flex-wrap: wrap;
@ -1288,10 +1468,14 @@ export default {
display: flex;
flex-direction: column;
}
.skill-item {
display: flex;
margin-bottom: 30rpx;
&:last-child { margin-bottom: 0; }
&:last-child {
margin-bottom: 0;
}
.cover-box {
position: relative;
@ -1306,11 +1490,14 @@ export default {
width: 100%;
height: 100%;
}
.play-icon {
position: absolute;
top: 50%; left: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 39rpx; height: 39rpx;
width: 39rpx;
height: 39rpx;
}
}
@ -1331,6 +1518,7 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
.skill-type {
display: flex;
align-items: center;
@ -1343,6 +1531,7 @@ export default {
margin-right: 8rpx;
border-radius: 50%;
}
.type-text {
background: #f9d3d760;
border-radius: 7rpx;
@ -1353,12 +1542,14 @@ export default {
padding: 2rpx 10rpx;
}
}
.skill-stats {
font-size: 22rpx;
color: #999;
margin-top: 10rpx;
display: flex;
align-items: center;
.view-icon {
width: 26rpx;
height: 22rpx;
@ -1370,7 +1561,17 @@ export default {
}
}
.line-1 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.line-2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }
.line-1 {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.line-2 {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
}
</style>

View File

@ -17,39 +17,25 @@
<text>{{ useMockData ? '关闭模拟数据' : '开启模拟数据' }}</text>
</view> -->
<view class="banner-section" v-if="bannerList && bannerList.length || info.video">
<view class="banner-section" v-if="bannerList && bannerList.length">
<!-- 原生视频组件 (就地播放) -->
<video v-if="info.video && isVideoPlaying" id="myVideo" class="banner-video" :src="info.video" autoplay controls
object-fit="cover"></video>
<!-- 轮播图区域 (当视频播放时隐藏) -->
<swiper v-else class="banner-swiper" circular @change="onSwiperChange" :autoplay="!info.video">
<!-- 轮播图区域 -->
<swiper class="banner-swiper" circular @change="onSwiperChange" :autoplay="false" :current="currentBannerIndex">
<!-- 视频作为第一项 -->
<swiper-item v-if="info.video">
<video id="myVideo" class="banner-video" :src="info.video" :autoplay="currentBannerIndex === 0" controls
object-fit="cover" :show-center-play-btn="false" :show-play-btn="false" @play="onVideoPlay"
@pause="onVideoPause" @ended="onVideoEnded"></video>
</swiper-item>
<!-- 图片轮播 -->
<swiper-item v-for="(item, index) in bannerList" :key="index">
<image class="banner-img" :src="item" mode="aspectFill"></image>
</swiper-item>
</swiper>
<!-- 居中的视频播放大图标 (当视频播放时隐藏) -->
<image v-if="info.video && !isVideoPlaying" class="center-play-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/bb720bb0-4ada-49f6-9ce5-38abfd613d5d.png"
@click="playVideoInPlace"></image>
<!-- 视频/图片 相册切换组件 (当视频播放时隐藏) -->
<view class="album" v-if="(info.video || bannerList.length > 0) && !isVideoPlaying">
<view class="album-left" @click="info.video ? playVideoInPlace() : goAlbum()">
{{ info.video ? "视频" : "图片" }}
</view>
<view class="album-line"></view>
<view class="album-right" @click="goAlbum">
<view class="album-right-text">相册</view>
<image src="/static/images/icons/right7_13.png" class="album-right-img"></image>
</view>
</view>
<!-- 指示器 (当视频播放时隐藏) -->
<view class="indicator" v-if="!isVideoPlaying && bannerList.length > 0">
<text>{{ currentBannerIndex + 1 }} / {{ bannerList.length }}</text>
<!-- 指示器 -->
<view class="indicator" v-if="bannerList.length > 0">
<text>{{ currentBannerIndex + 1 }} / {{ totalSlides }}</text>
</view>
</view>
@ -164,6 +150,27 @@
</view>
</view>
<!-- 拨打电话选择弹窗 -->
<view class="phone-popup" :class="{ show: showPhonePopup }">
<view class="phone-popup-mask" @click="closePhonePopup"></view>
<view class="phone-popup-content">
<view class="phone-popup-header">
<text class="phone-popup-title">拨打电话</text>
</view>
<view class="phone-popup-body">
<view class="phone-option" v-if="info.contact_phone" @click="selectPhone(info.contact_phone)">
<text class="phone-number">{{ info.contact_phone }}</text>
</view>
<view class="phone-option" v-if="info.alternate_phone" @click="selectPhone(info.alternate_phone)">
<text class="phone-number">{{ info.alternate_phone }}</text>
</view>
</view>
<view class="phone-popup-cancel" @click="closePhonePopup">
<text class="cancel-text">取消</text>
</view>
</view>
</view>
<tipsPopup2 :show="tipShow" @closePopup="closePopup" sureText="确认" @okBtn="okBtn">
{{ tipsText }}
</tipsPopup2>
@ -196,6 +203,7 @@ export default {
tipShow: false, //
tipsText: "", //
tipType: "", //
showPhonePopup: false, //
isCollected: false, //
//
@ -204,7 +212,6 @@ export default {
iconCollectOn: 'https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/fe2011b0-a34d-46ee-911a-0ea6f099ad77.png',
// ==================================
isVideoPlaying: false, //
phoneIconTop: 20, // Top
phoneIconRight: 50, // Right
@ -296,6 +303,10 @@ export default {
showTabSection() {
return this.availableTabs.length > 0;
},
// +
totalSlides() {
return this.bannerList.length + (this.info.video ? 1 : 0);
},
canSubmit() {
const d = this.formData;
const baseValid = d.contact_name && d.contact_phone && d.province_code && d.city_code && d.area_code && d.intention;
@ -439,18 +450,49 @@ export default {
//
makeCall() {
//
const phone = this.info.contact_phone || '';
if (phone) {
if (!this.isLogin) {
this.tipsText = "您现在还未登录,是否确定登录?";
this.tipShow = true;
this.tipType = "login";
return; //
}
const contactPhone = this.info.contact_phone || '';
const alternatePhone = this.info.alternate_phone || '';
//
if (contactPhone && alternatePhone) {
this.showPhonePopup = true;
} else if (contactPhone) {
//
this.doMakeCall(contactPhone);
} else if (alternatePhone) {
//
this.doMakeCall(alternatePhone);
} else {
uni.showToast({ title: '暂无联系电话', icon: 'none' });
}
},
//
selectPhone(phone) {
this.closePhonePopup();
this.doMakeCall(phone);
},
//
closePhonePopup() {
this.showPhonePopup = false;
},
//
doMakeCall(phone) {
uni.makePhoneCall({
phoneNumber: String(phone),
fail: (err) => {
console.log('取消拨打或拨打失败', err);
}
});
} else {
uni.showToast({ title: '暂无联系电话', icon: 'none' });
}
},
goAlbum() {
@ -459,9 +501,18 @@ export default {
});
},
//
playVideoInPlace() {
this.isVideoPlaying = true;
//
onVideoPlay() {
console.log('视频开始播放');
},
onVideoPause() {
console.log('视频暂停');
},
onVideoEnded() {
//
if (this.bannerList.length > 0) {
this.currentBannerIndex = 1;
}
},
// Mock
@ -472,7 +523,6 @@ export default {
},
getBrandDetails() {
this.isVideoPlaying = false; //
if (this.useMockData) {
this.injectMockData();
return;
@ -1132,4 +1182,100 @@ export default {
.popup-btn.confirm .btn-text {
color: #FFFFFF;
}
/* 拨打电话弹窗样式 */
.phone-popup {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 999;
visibility: hidden;
opacity: 0;
transition: all 0.3s ease;
}
.phone-popup.show {
visibility: visible;
opacity: 1;
}
.phone-popup-mask {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
}
.phone-popup-content {
position: absolute;
left: 0;
right: 0;
bottom: 0;
background-color: #F5F5F5;
border-radius: 24rpx 24rpx 0 0;
transform: translateY(100%);
transition: transform 0.3s ease;
}
.phone-popup.show .phone-popup-content {
transform: translateY(0);
}
.phone-popup-header {
padding: 30rpx;
text-align: center;
background-color: #FFFFFF;
border-radius: 24rpx 24rpx 0 0;
}
.phone-popup-title {
font-size: 32rpx;
font-weight: 500;
color: #333333;
}
.phone-popup-body {
background-color: #FFFFFF;
margin-top: 2rpx;
}
.phone-option {
display: flex;
flex-direction: column;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #EEEEEE;
}
.phone-option:last-child {
border-bottom: none;
}
.phone-label {
font-size: 26rpx;
color: #999999;
margin-bottom: 10rpx;
}
.phone-number {
font-size: 34rpx;
color: #333333;
font-weight: 500;
}
.phone-popup-cancel {
margin-top: 16rpx;
padding: 30rpx;
text-align: center;
background-color: #FFFFFF;
}
.cancel-text {
font-size: 32rpx;
color: #333333;
}
</style>

View File

@ -2,7 +2,8 @@
<view class="collection-page">
<custom-navbar title="我的收藏" :showBack="true" backgroundColor="#FFFFFF" :show-headle="true" borderBottom="none"
headleSrc="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/51ebca5d-95c5-4fb8-8aa3-560a79100d25.png" @onHeadleClick="goToSearch">
headleSrc="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/51ebca5d-95c5-4fb8-8aa3-560a79100d25.png"
@onHeadleClick="goToSearch">
</custom-navbar>
<view class="nav-placeholder" :style="{ height: navHeight + 'px' }"></view>
@ -10,18 +11,10 @@
<view class="tab-bar-wrap" :style="{ top: navHeight + 'px' }">
<view class="tab-bar">
<view class="tab-items">
<view
class="tab-item"
:class="{ active: currentTab === 'brand' }"
@tap="switchTab('brand')"
>
<view class="tab-item" :class="{ active: currentTab === 'brand' }" @tap="switchTab('brand')">
收藏的品牌
</view>
<view
class="tab-item"
:class="{ active: currentTab === 'course' }"
@tap="switchTab('course')"
>
<view class="tab-item" :class="{ active: currentTab === 'course' }" @tap="switchTab('course')">
收藏的课程
</view>
</view>
@ -32,7 +25,8 @@
</view>
</view>
<view class="filter-panel" :class="{ 'show': filterVisible }" :style="{ top: filterTop + 'px' }" catchtouchmove="true">
<view class="filter-panel" :class="{ 'show': filterVisible }" :style="{ top: filterTop + 'px' }"
catchtouchmove="true">
<view class="filter-mask" @tap="closeFilterPanel"></view>
<view class="filter-container">
@ -40,13 +34,8 @@
<view class="filter-group" v-for="group in brandFilterData" :key="group.id">
<view class="group-title">{{ group.title }}</view>
<view class="pill-list">
<view
class="pill-item"
v-for="sub in group.children"
:key="sub.id"
:class="{ active: selectedSecondIds.includes(sub.id) }"
@tap="toggleSecondSelect(sub.id)"
>
<view class="pill-item" v-for="sub in group.children" :key="sub.id"
:class="{ active: selectedSecondIds.includes(sub.id) }" @tap="toggleSecondSelect(sub.id)">
{{ sub.title }}
</view>
</view>
@ -54,18 +43,12 @@
</scroll-view>
<view v-else class="course-filter">
<view
class="course-type-item"
:class="{ active: selectedCourseType === 'platform' }"
@tap="selectCourseType('platform')"
>
<view class="course-type-item" :class="{ active: selectedCourseType === 'platform' }"
@tap="selectCourseType('platform')">
平台课程
</view>
<view
class="course-type-item"
:class="{ active: selectedCourseType === 'brand' }"
@tap="selectCourseType('brand')"
>
<view class="course-type-item" :class="{ active: selectedCourseType === 'brand' }"
@tap="selectCourseType('brand')">
品牌课程
</view>
</view>
@ -79,30 +62,24 @@
<view class="collection-content" v-if="currentTab === 'brand'">
<view class="brand-grid" v-if="filteredBrandList.length > 0">
<brand-card
class="brand-card-wrap"
v-for="(item, index) in filteredBrandList"
:key="index"
:item="item"
:tagKeys="item.tagKeys"
@click="goToBrandDetail(item)"
></brand-card>
<brand-card class="brand-card-wrap" v-for="(item, index) in filteredBrandList" :key="index" :item="item"
:tagKeys="item.tagKeys" @click="goToBrandDetail(item)"></brand-card>
</view>
<view class="empty-state" v-else>
<image class="empty-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/da814ede-1adc-4f90-8cdf-5357a12fab27.png"></image>
<image class="empty-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/da814ede-1adc-4f90-8cdf-5357a12fab27.png">
</image>
</view>
</view>
<view class="collection-content" v-else>
<view class="course-list" v-if="filteredCourseList.length > 0">
<skill-card
v-for="(item, index) in filteredCourseList"
:key="index"
:item="item"
></skill-card>
<skill-card v-for="(item, index) in filteredCourseList" :key="index" :item="item"></skill-card>
</view>
<view class="empty-state" v-else>
<image class="empty-icon" src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/da814ede-1adc-4f90-8cdf-5357a12fab27.png"></image>
<image class="empty-icon"
src="https://mrrplus.oss-cn-beijing.aliyuncs.com/photo/system/da814ede-1adc-4f90-8cdf-5357a12fab27.png">
</image>
</view>
</view>
<view style="height: 120rpx;"></view>
@ -213,7 +190,7 @@ export default {
title: first.title,
children: ((subRes.code === 200 || subRes.state === 1) && subRes.data) ? subRes.data : []
}
} catch(e) {
} catch (e) {
return { id: first.id, title: first.title, children: [] }
}
});
@ -240,9 +217,9 @@ export default {
//
selectCourseType(type) {
//
if(this.selectedCourseType === type){
if (this.selectedCourseType === type) {
this.selectedCourseType = ''
}else{
} else {
this.selectedCourseType = type
}
},
@ -442,7 +419,8 @@ export default {
/* 将页面左右 padding 转移到内容区,保证 Tab 背景贯穿全屏 */
.tab-bar-wrap {
position: sticky; /* 吸顶,保证滑动页面时一直显示在最前面 */
position: sticky;
/* 吸顶,保证滑动页面时一直显示在最前面 */
background: #fff;
padding: 10rpx 24rpx;
z-index: 101;
@ -493,6 +471,7 @@ export default {
width: 16rpx;
height: 10rpx;
transition: transform 0.3s ease;
/* 展开时图标倒转 */
&.rotate {
transform: rotate(180deg);
@ -507,39 +486,52 @@ export default {
left: 0;
right: 0;
bottom: 0;
z-index: 100; /* 低于 Tab区的101保证隐藏时躲在其后 */
pointer-events: none; /* 面板关闭时,穿透点击到底部列表 */
overflow: hidden; /* 防止抽屉向上滑出时外溢 */
z-index: 100;
/* 低于 Tab区的101保证隐藏时躲在其后 */
pointer-events: none;
/* 面板关闭时,穿透点击到底部列表 */
overflow: hidden;
/* 防止抽屉向上滑出时外溢 */
&.show {
pointer-events: auto; /* 打开时恢复点击拦截 */
pointer-events: auto;
/* 打开时恢复点击拦截 */
.filter-mask {
opacity: 1;
}
.filter-container {
transform: translateY(50rpx); /* 滑出 */
transform: translateY(50rpx);
/* 滑出 */
}
}
.filter-mask {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.4);
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.4);
opacity: 0;
transition: opacity 0.3s ease-in-out;
}
.filter-container {
position: absolute;
top: 0; left: 0; right: 0;
top: 0;
left: 0;
right: 0;
background: #fff;
border-radius: 0 0 30rpx 30rpx;
padding: 40rpx 30rpx;
max-height: 80vh;
display: flex;
flex-direction: column;
box-shadow: 0 10rpx 20rpx rgba(0,0,0,0.05);
transform: translateY(-100%); /* 默认隐藏在上方即Tab背后 */
box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.05);
transform: translateY(-100%);
/* 默认隐藏在上方即Tab背后 */
transition: transform 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}
}
@ -548,6 +540,7 @@ export default {
.filter-scroll {
max-height: 50vh;
}
.filter-group {
margin-bottom: 30rpx;
@ -568,7 +561,8 @@ export default {
/* 通用胶囊按钮 */
.pill-item {
width: calc(25% - 16rpx); /* 25%是一行四个,减去间距 */
width: calc(25% - 16rpx);
/* 25%是一行四个,减去间距 */
height: 58rpx;
background: #F5F5F5;
font-weight: 400;
@ -583,7 +577,8 @@ export default {
border-radius: 12rpx;
transition: all 0.3s;
box-sizing: border-box; /* 防止 padding 会撑大盒子 */
box-sizing: border-box;
/* 防止 padding 会撑大盒子 */
&.active {
background: #FFF0F2;
@ -618,7 +613,8 @@ export default {
padding-top: 20rpx;
/* border-top: 1rpx solid #F5F5F5; */
.reset-btn, .confirm-btn {
.reset-btn,
.confirm-btn {
width: 47%;
text-align: center;
padding: 20rpx 0;