Browse Source

'修改语雀问题'

v1
Lj 2 months ago
parent
commit
dc7e45dbc8
8 changed files with 409 additions and 526 deletions
  1. +3
    -4
      App.vue
  2. +17
    -17
      config.js
  3. +20
    -15
      pages/component/home.vue
  4. +5
    -12
      pages/component/my.vue
  5. +274
    -218
      pages/component/recycle.vue
  6. +80
    -237
      pages/subcomponent/about.vue
  7. +0
    -19
      pages/subcomponent/admin_faq.vue
  8. +10
    -4
      pages/subcomponent/pickup.vue

+ 3
- 4
App.vue View File

@ -19,7 +19,6 @@
}, },
onLoad: function() { onLoad: function() {
this.getBannerList() this.getBannerList()
this.getConfigData()
console.log('App Show') console.log('App Show')
}, },
onHide: function() { onHide: function() {
@ -46,10 +45,10 @@
}, },
getConfigData() { getConfigData() {
this.$api('getConfig', {}, res => { this.$api('getConfig', {}, res => {
// console.log('Config data response:', JSON.parse(JSON.stringify(res)) )
console.log('Config data response:', JSON.parse(JSON.stringify(res)) )
if (res && res.success && Array.isArray(res.result)) { if (res && res.success && Array.isArray(res.result)) {
getApp().globalData.configData = res.result
// console.log('Config data set:', JSON.parse(JSON.stringify(this.configData)) )
getApp().globalData.configData = res.result
// console.log('Config data set:', JSON.parse(JSON.stringify(this.configData)) )
} }
}) })
}, },


+ 17
- 17
config.js View File

@ -2,26 +2,26 @@
const type = 'dev' const type = 'dev'
const config = { const config = {
dev: {
baseUrl: 'http://youyi-test.natapp1.cc',
},
prod: {
baseUrl: 'https://www.ddmhs.top',
}
dev: {
baseUrl: 'https://www.ddmhs.top',
},
prod: {
baseUrl: 'https://www.ddmhs.top',
}
} }
const defaultConfig = { const defaultConfig = {
mapKey: 'XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU',
aliOss: {
url: 'https://oss.ddmhs.top/',
config: {
region: 'oss-cn-hangzhou',
accessKeyId: 'LTAI5tDXgH5a42GbUZroVvio',
accessKeySecret: 'TK7jQ0KeXnFBHNxpEHzT83Spp81tl5',
bucket: 'ossddmhs',
endpoint: 'oss-cn-hangzhou.aliyuncs.com',
}
}
mapKey: 'XMBBZ-BCPCV-SXPPQ-5Y7MY-PHZXK-YFFVU',
aliOss: {
url: 'https://oss.ddmhs.top/',
config: {
region: 'oss-cn-hangzhou',
accessKeyId: 'LTAI5tDXgH5a42GbUZroVvio',
accessKeySecret: 'TK7jQ0KeXnFBHNxpEHzT83Spp81tl5',
bucket: 'ossddmhs',
endpoint: 'oss-cn-hangzhou.aliyuncs.com',
}
}
} }
import utils from './utils/utils.js' import utils from './utils/utils.js'


+ 20
- 15
pages/component/home.vue View File

@ -11,8 +11,19 @@
style="width: 100%; height: 380rpx;" style="width: 100%; height: 380rpx;"
> >
<swiper-item v-for="(item, index) in bannerList" :key="item.id || index"> <swiper-item v-for="(item, index) in bannerList" :key="item.id || index">
<image :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" v-if="item.type == 0"/>
<video :src="item.voUrl" mode="aspectFill" style="width: 100%; height: 100%;" v-else/>
<video
v-if="item.type == 1"
:src="item.image"
autoplay
muted
loop
:controls="false"
:show-play-btn="false"
:show-center-play-btn="false"
object-fit="cover"
style="width: 100%; height: 100%;"
></video>
<image v-else :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" />
</swiper-item> </swiper-item>
</swiper> </swiper>
</view> </view>
@ -79,9 +90,8 @@
</view> </view>
<!-- 价格概览 --> <!-- 价格概览 -->
<view class="price-section"
@click="changeTo(1)">
<view class="section-header">
<view class="price-section">
<view class="section-header" @click="getPickupto">
<text class="title">价格概览</text> <text class="title">价格概览</text>
<view class="more"> <view class="more">
<uni-icons type="right" size="14" color="#999"></uni-icons> <uni-icons type="right" size="14" color="#999"></uni-icons>
@ -89,13 +99,8 @@
</view> </view>
</view> </view>
<view class="price-grid"> <view class="price-grid">
<view class="price-item" v-for="(item, index) in priceList" :key="item.id || index"
@tap.stop="goToRecycleCategory(item.id)">
<image v-if="item.icon"
:src="item.icon"
mode="aspectFill"
style="width: 200rpx;height: 200rpx;"
class="item-icon"></image>
<view class="price-item" v-for="(item, index) in priceList" :key="item.id || index" @tap="goToRecycleCategory(item.id)">
<image v-if="item.icon" :src="item.icon" mode="aspectFit" class="item-icon"></image>
<view v-else class="item-icon placeholder"></view> <view v-else class="item-icon placeholder"></view>
<text class="item-name">{{item.name}}</text> <text class="item-name">{{item.name}}</text>
<text class="item-price">¥ {{item.price}} <text class="item-price">¥ {{item.price}}
@ -398,7 +403,7 @@ export default {
.banner { .banner {
width: 100%; width: 100%;
height: 380rpx;
height: 350rpx;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
border-radius: 0 0 30rpx 30rpx; border-radius: 0 0 30rpx 30rpx;
@ -630,8 +635,8 @@ export default {
padding: 30rpx; padding: 30rpx;
background-color: #fff8ea; background-color: #fff8ea;
.item-icon { .item-icon {
width: 80rpx;
height: 80rpx;
width: 100rpx;
height: 100rpx;
margin-bottom: 10rpx; margin-bottom: 10rpx;
&.placeholder { &.placeholder {
width: 80rpx; width: 80rpx;


+ 5
- 12
pages/component/my.vue View File

@ -2,18 +2,7 @@
<view class="container" > <view class="container" >
<!-- 顶部banner --> <!-- 顶部banner -->
<view class="banner"> <view class="banner">
<swiper
:indicator-dots="false"
:autoplay="true"
:interval="3000"
:duration="500"
circular
style="width: 100%; height: 400rpx;"
>
<swiper-item v-for="(item, index) in bannerList" :key="item.id || index">
<image :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" />
</swiper-item>
</swiper>
<image v-if="myBannerImage" :src="myBannerImage" mode="aspectFill" style="width: 100%; height: 100%;" />
</view> </view>
<view class="user-cards" v-if="!login_status"> <view class="user-cards" v-if="!login_status">
<view class="user-info"> <view class="user-info">
@ -379,6 +368,10 @@ export default {
}, },
bannerList() { bannerList() {
return getApp().globalData.bannerList || [] return getApp().globalData.bannerList || []
},
myBannerImage() {
const banner = (getApp().globalData.bannerList || []).find(item => item.title === '我的-轮播图');
return banner ? banner.image : '';
} }
}, },
onLoad() { onLoad() {


+ 274
- 218
pages/component/recycle.vue View File

@ -8,10 +8,22 @@
:interval="3000" :interval="3000"
:duration="500" :duration="500"
circular circular
style="width: 100%; height: 320rpx;"
style="width: 100%; height: 400rpx;"
> >
<swiper-item v-for="(item, index) in bannerList" :key="item.id || index"> <swiper-item v-for="(item, index) in bannerList" :key="item.id || index">
<image :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" />
<video
v-if="item.type == 1"
:src="item.image"
autoplay
muted
loop
:controls="false"
:show-play-btn="false"
:show-center-play-btn="false"
object-fit="cover"
style="width: 100%; height: 100%;"
></video>
<image v-else :src="item.image" mode="aspectFill" style="width: 100%; height: 100%;" />
</swiper-item> </swiper-item>
</swiper> </swiper>
</view> </view>
@ -25,9 +37,9 @@
:key="category.id || index" :key="category.id || index"
class="category-item" class="category-item"
:class="{ active: currentCategory === index }" :class="{ active: currentCategory === index }"
@tap="switchCategory(index)"
@click="switchCategory(index)"
> >
<view class="category-dot" v-if="getCategoryItemCount(index) > 0"></view>
<view class="category-dot" v-if="getCategoryItemCount(index) > 0">{{ getCategoryItemCount(index) }}</view>
{{ category.title }} {{ category.title }}
</view> </view>
</view> </view>
@ -36,24 +48,24 @@
<scroll-view class="goods-content" scroll-y @scrolltolower="loadMoreGoods"> <scroll-view class="goods-content" scroll-y @scrolltolower="loadMoreGoods">
<view class="goods-section"> <view class="goods-section">
<view class="goods-item" v-for="(item, index) in recycleList" :key="index"> <view class="goods-item" v-for="(item, index) in recycleList" :key="index">
<image v-if="item.image" :src="item.image" class="goods-item-img" mode="aspectFill" />
<image v-if="item.image" :src="item.image" class="goods-item-img" mode="aspectFit" />
<view class="goods-info-wrap"> <view class="goods-info-wrap">
<view class="goods-header"> <view class="goods-header">
<view class="goods-name">{{item.name}}</view>
<!-- <view class="rules-link" @tap="showRules(item)">
<view class="rules">
<text>回收规则</text>
<uni-icons type="right" size="14" color="#999"></uni-icons>
<text class="goods-name">{{item.name}}</text>
<view class="brand-check-placeholder" v-if="item.shopCion">
<view class="brand-check" @click="checkBrand(index)">
<text>查看品牌</text>
<uni-icons type="right" size="12" color="#ff7a0e"></uni-icons>
</view> </view>
</view> -->
<view class="rules-link" v-if="item.shopCion" @tap="checkBrand(index)">
<view class="rules">
<text>查看品牌</text>
<uni-icons type="right" size="14" color="#999"></uni-icons>
</view>
</view>
</view>
</view> </view>
<text class="goods-desc">{{item.service}}</text> <text class="goods-desc">{{item.service}}</text>
<view class="rules-link" @click="showRules(item)">
<view class="rules">
<text>回收规则</text>
<uni-icons type="right" size="14" color="#999"></uni-icons>
</view>
</view>
<view class="goods-info"> <view class="goods-info">
<view class="price-info"> <view class="price-info">
<text class="price-symbol">¥</text> <text class="price-symbol">¥</text>
@ -61,19 +73,11 @@
<text class="price-unit">/</text> <text class="price-unit">/</text>
</view> </view>
<view class="quantity-control"> <view class="quantity-control">
<button class="btn-minus" @tap="updateQuantity(index, -1)">-</button>
<button class="btn-minus" @click="updateQuantity(index, -1)">-</button>
<text class="quantity">{{item.quantity || 0}}</text> <text class="quantity">{{item.quantity || 0}}</text>
<button class="btn-plus" @tap="updateQuantity(index, 1)">+</button>
<button class="btn-plus" @click="updateQuantity(index, 1)">+</button>
</view> </view>
</view> </view>
<!-- <view class="brand-check" v-if="item.shopCion" @tap="checkBrand(index)">
<text>查看品牌</text>
<uni-icons type="right" size="14" color="#ff7a0e"></uni-icons>
</view> -->
<view class="brand-check" @tap="showRules(item)">
<text>回收规则</text>
<uni-icons type="right" size="14" color="#ff7a0e"></uni-icons>
</view>
</view> </view>
</view> </view>
</view> </view>
@ -88,7 +92,7 @@
<text class="other-unrecycle-price">¥ /</text> <text class="other-unrecycle-price">¥ /</text>
</view> </view>
</view> </view>
<button class="other-unrecycle-btn" disabled>+</button>
<button class="other-unrecycle-btn" open-type="contact">+</button>
</view> </view>
<view v-if="loadingMore" class="loading-more">加载中...</view> <view v-if="loadingMore" class="loading-more">加载中...</view>
<view v-else-if="finished" class="loading-more">没有更多了</view> <view v-else-if="finished" class="loading-more">没有更多了</view>
@ -105,22 +109,22 @@
<view class="bottom-left"> <view class="bottom-left">
<view class="summary-row"> <view class="summary-row">
<text class="summary-label">已选 <text class="summary-count">{{totalCount}}</text> 预计回收可得</text> <text class="summary-label">已选 <text class="summary-count">{{totalCount}}</text> 预计回收可得</text>
<uni-icons type="help" size="18" color="#b2b2b2" style="margin: 0 8rpx;" />
<uni-icons type="help" size="18" color="#b2b2b2" style="margin: 0 8rpx;" @tap="showPriceInfoPopups" />
</view> </view>
<view class="amount-row"> <view class="amount-row">
<uni-icons :type="showDetailPanel ? 'up' : 'down'" size="18" color="#5e5e5e" style="margin-right: 8rpx;vertical-align: middle;" @tap="toggleDetailPanel" />
<uni-icons :type="showDetailPanel ? 'up' : 'down'" size="18" color="#5e5e5e" style="margin-right: 8rpx;vertical-align: middle;" @click="toggleDetailPanel" />
<text class="amount">¥{{priceRange.min}}-{{priceRange.max}}</text> <text class="amount">¥{{priceRange.min}}-{{priceRange.max}}</text>
</view> </view>
</view> </view>
<button class="submit-btn" @tap="submitOrder">预约上门取件</button>
<button class="submit-btn" @click="submitOrder">预约上门取件</button>
</view> </view>
<view class="bottom-bar-divider"></view> <view class="bottom-bar-divider"></view>
</view> </view>
<!-- 明细弹窗遮罩和弹窗 --> <!-- 明细弹窗遮罩和弹窗 -->
<view v-if="showDetailPanel" class="detail-popup-mask" @tap.self="toggleDetailPanel">
<view class="detail-popup" @tap.stop>
<view class="detail-popup-close" @tap="toggleDetailPanel">×</view>
<view v-if="showDetailPanel" class="detail-popup-mask" @click.self="toggleDetailPanel">
<view class="detail-popup" @click.stop>
<view class="detail-popup-close" @click="toggleDetailPanel">×</view>
<view class="green-tip-bar popup-green-tip"> <view class="green-tip-bar popup-green-tip">
回收范围仅支持回收以上品类按件回收预计比称重回收多 回收范围仅支持回收以上品类按件回收预计比称重回收多
<text class="tip-highlight"> 3.76</text> <text class="tip-highlight"> 3.76</text>
@ -137,9 +141,9 @@
<text class="panel-item-price">¥{{item.price}}/</text> <text class="panel-item-price">¥{{item.price}}/</text>
</view> </view>
<view class="panel-quantity-control"> <view class="panel-quantity-control">
<button class="btn-minus" @tap="updateQuantityByProduct(item, -1)">-</button>
<button class="btn-minus" @click="updateQuantityByProduct(item, -1)">-</button>
<text class="quantity">{{item.quantity}}</text> <text class="quantity">{{item.quantity}}</text>
<button class="btn-plus" @tap="updateQuantityByProduct(item, 1)">+</button>
<button class="btn-plus" @click="updateQuantityByProduct(item, 1)">+</button>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
@ -147,18 +151,40 @@
<view class="bottom-left"> <view class="bottom-left">
<view class="summary-row"> <view class="summary-row">
<text class="summary-label">已选 <text class="summary-count">{{totalCount}}</text> 预计回收可得</text> <text class="summary-label">已选 <text class="summary-count">{{totalCount}}</text> 预计回收可得</text>
<uni-icons type="help" size="18" color="#b2b2b2" style="margin: 0 8rpx;" />
<uni-icons type="help" size="18" color="#b2b2b2" style="margin: 0 8rpx;" @tap="showPriceInfoPopups" />
</view> </view>
<view class="amount-row"> <view class="amount-row">
<uni-icons :type="showDetailPanel ? 'up' : 'down'" size="18" color="#5e5e5e" style="margin-right: 8rpx;vertical-align: middle;" @tap="toggleDetailPanel" />
<uni-icons :type="showDetailPanel ? 'up' : 'down'" size="18" color="#5e5e5e" style="margin-right: 8rpx;vertical-align: middle;" @click="toggleDetailPanel" />
<text class="amount">¥{{priceRange.min}}-{{priceRange.max}}</text> <text class="amount">¥{{priceRange.min}}-{{priceRange.max}}</text>
</view> </view>
</view> </view>
<button class="submit-btn" @tap="submitOrder">预约上门取件</button>
<button class="submit-btn" @click="submitOrder">预约上门取件</button>
</view> </view>
</view> </view>
</view> </view>
<!-- 价格说明弹窗 -->
<view v-if="showPriceInfoPopup" class="price-info-popup-mask" @click.self="closePriceInfoPopup">
<view class="price-info-popup">
<view class="price-info-popup-title">回收规则</view>
<scroll-view class="price-info-popup-content" scroll-y>
<view class="price-info-section">
<view class="price-info-heading">关于旧衣质检</view>
<view class="price-info-text">请确认本次回收旧衣是可以进行二次穿着的程度如回收旧衣有破损磨损开线变形起球发黄染色污渍配饰脱落或款式老旧等问题无法通过质检</view>
</view>
<view class="price-info-section">
<view class="price-info-heading">质检报告</view>
<view class="price-info-text">回收商收到衣后1-3个工作日内完成衣质检报告</view>
</view>
<view class="price-info-section">
<view class="price-info-heading">质检结果与回收价格</view>
<view class="price-info-text">若回收旧衣质检通过质检价格与用户提交订单时的预估价格一致回收商将按照预估价打款至您的小程序账户余额</view>
</view>
</scroll-view>
<button class="price-info-popup-btn" @click="closePriceInfoPopup">我知道了</button>
</view>
</view>
<!-- 根据角色显示不同的导航栏 --> <!-- 根据角色显示不同的导航栏 -->
<uv-tabbar <uv-tabbar
v-if="ishow" v-if="ishow"
@ -197,7 +223,7 @@
<view v-if="showBrandPopup" class="brand-popup-mask"> <view v-if="showBrandPopup" class="brand-popup-mask">
<view class="brand-popup"> <view class="brand-popup">
<view class="brand-popup-header"> <view class="brand-popup-header">
<text class="brand-popup-close" @tap="closeBrandPopup">关闭</text>
<text class="brand-popup-close" @click="closeBrandPopup">关闭</text>
<text class="brand-popup-title">可回收的品牌</text> <text class="brand-popup-title">可回收的品牌</text>
</view> </view>
<view class="brand-popup-search"> <view class="brand-popup-search">
@ -206,28 +232,26 @@
<scroll-view class="brand-popup-list" scroll-y :scroll-into-view="scrollToView"> <scroll-view class="brand-popup-list" scroll-y :scroll-into-view="scrollToView">
<view v-for="letter in brandIndexList" :key="letter" :id="'brand-letter-' + letter"> <view v-for="letter in brandIndexList" :key="letter" :id="'brand-letter-' + letter">
<view class="brand-letter">{{letter}}</view> <view class="brand-letter">{{letter}}</view>
<view v-for="brand in filteredBrandList.filter(b => b.letter === letter)" :key="brand.name" class="brand-item" @tap="openBrandConfirm(brand)">
<view v-for="brand in filteredBrandList.filter(b => b.letter === letter)" :key="brand.name" class="brand-item" @click="openBrandConfirm(brand)">
<image :src="brand.logo" class="brand-logo" mode="aspectFit" /> <image :src="brand.logo" class="brand-logo" mode="aspectFit" />
<text class="brand-name">{{brand.name}}</text> <text class="brand-name">{{brand.name}}</text>
</view> </view>
</view> </view>
</scroll-view> </scroll-view>
<view class="brand-index-bar"> <view class="brand-index-bar">
<text v-for="letter in brandIndexList" :key="letter" :class="{active: currentLetter === letter}" @tap="scrollToLetter(letter)">{{letter}}</text>
<text v-for="letter in brandIndexList" :key="letter" :class="{active: currentLetter === letter}" @click="scrollToLetter(letter)">{{letter}}</text>
</view> </view>
</view> </view>
</view> </view>
<!-- 回收规则弹窗 --> <!-- 回收规则弹窗 -->
<view v-if="showRulePopup" class="rule-popup-mask" @tap.self="closeRulePopup">
<view v-if="showRulePopup" class="rule-popup-mask" @click.self="closeRulePopup">
<view class="rule-popup"> <view class="rule-popup">
<view class="rule-popup-title">回收规则</view> <view class="rule-popup-title">回收规则</view>
<scroll-view class="rule-popup-content" scroll-y> <scroll-view class="rule-popup-content" scroll-y>
<rich-text :nodes="ruleHtml"/>
<rich-text :nodes="ruleHtml" />
</scroll-view> </scroll-view>
<button class="rule-popup-btn" @tap="closeRulePopup" :class="{ disabled: ruleCountdown > 0 }">
{{ ruleCountdown > 0 ? `我知道了(${ruleCountdown}s)` : '我知道了' }}
</button>
<button class="rule-popup-btn" @click="closeRulePopup">我知道了</button>
<!-- <view class="rule-popup-close" @tap="closeRulePopup"> <!-- <view class="rule-popup-close" @tap="closeRulePopup">
<uni-icons type="close" size="36" color="#fff" /> <uni-icons type="close" size="36" color="#fff" />
</view> --> </view> -->
@ -239,20 +263,20 @@
<view class="pickup-confirm-popup"> <view class="pickup-confirm-popup">
<view class="pickup-confirm-title">温馨提示</view> <view class="pickup-confirm-title">温馨提示</view>
<view class="pickup-confirm-content"> <view class="pickup-confirm-content">
1.当前回收快递免费上门由于快递成本较高为避免不必要的成本及资源二次浪费不属于可回收品类或不符合回收标准的物品请勿寄出<br/><br/>
2.已通过的回收物品将正常结算不符合回收要求的物品可选择快递取回运费自付请在订单结算后48小时内联系在线客服安排取回逾期未联系将默认捐赠无法再次取回<br/><br/>
3.若用户寄出大量不可回收的物品平台有权限制下次回收权限或取消下次包邮服务<br/><br/>
4.对于合格率高的回收订单平台将根据实际情况给予额外回收奖励
<view class="confirm-item confirm-item-red">1.当前回收快递免费上门由于快递成本较高为避免不必要的成本及资源二次浪费不属于可回收品类或不符合回收标准的物品请勿寄出</view>
<view class="confirm-item">2.已通过的回收物品将正常结算不符合回收要求的物品可选择快递取回运费自付请在订单结算后48小时内联系在线客服安排取回逾期未联系将默认捐赠无法再次取回</view>
<view class="confirm-item">3.若用户寄出大量不可回收的物品平台有权限制下次回收权限或取消下次包邮服务</view>
<view class="confirm-item">4.对于合格率高的回收订单平台将根据实际情况给予额外回收奖励</view>
</view> </view>
<view class="pickup-confirm-btn-row"> <view class="pickup-confirm-btn-row">
<button class="pickup-confirm-btn" @tap="handlePickupCancel">取消回收</button>
<button class="pickup-confirm-btn agree" @tap="handlePickupAgree">我同意</button>
<button class="pickup-confirm-btn" @click="handlePickupCancel">取消回收</button>
<button class="pickup-confirm-btn agree" @click="handlePickupAgree">我同意</button>
</view> </view>
</view> </view>
</view> </view>
<!-- 品牌确认弹窗 --> <!-- 品牌确认弹窗 -->
<view v-if="showBrandConfirm" class="brand-confirm-mask" @tap.self="closeBrandConfirm">
<view v-if="showBrandConfirm" class="brand-confirm-mask" @click.self="closeBrandConfirm">
<view class="brand-confirm-popup"> <view class="brand-confirm-popup">
<view class="brand-confirm-title">品牌确认提示</view> <view class="brand-confirm-title">品牌确认提示</view>
<view class="brand-confirm-logo-wrap"> <view class="brand-confirm-logo-wrap">
@ -261,8 +285,8 @@
<view class="brand-confirm-name">{{ brandConfirmInfo.name }}</view> <view class="brand-confirm-name">{{ brandConfirmInfo.name }}</view>
<view class="brand-confirm-desc">请确认所选品牌是否与实物品牌信息一致否则将无法进行回收</view> <view class="brand-confirm-desc">请确认所选品牌是否与实物品牌信息一致否则将无法进行回收</view>
<view class="brand-confirm-btn-row"> <view class="brand-confirm-btn-row">
<button class="brand-confirm-btn retry" @tap="closeBrandConfirm">重新选择</button>
<button class="brand-confirm-btn confirm" @tap="confirmBrand">确认一致</button>
<button class="brand-confirm-btn retry" @click="closeBrandConfirm">重新选择</button>
<button class="brand-confirm-btn confirm" @click="confirmBrand">确认一致</button>
</view> </view>
</view> </view>
</view> </view>
@ -304,10 +328,8 @@ export default {
loadingMore: false, loadingMore: false,
finished: false, finished: false,
pendingBrandIndex: null, // index pendingBrandIndex: null, // index
shownRuleItems: new Set(), // ID
ruleCountdown: 0, //
ruleCountdownTimer: null, //
pendingAddItem: null, //
showPriceInfoPopup: false,
isWaitingForBrandSelection: false, //
} }
}, },
computed: { computed: {
@ -357,9 +379,22 @@ export default {
categories() { categories() {
const list = getApp().globalData.pricePreviewList || [] const list = getApp().globalData.pricePreviewList || []
return list.filter(item => item.pid === '0').sort((a, b) => a.sort - b.sort) return list.filter(item => item.pid === '0').sort((a, b) => a.sort - b.sort)
},
minMoney() {
const config = getApp().globalData.configData || [];
const item = config.find(i => i.keyName === 'min_money');
return item ? parseFloat(item.keyContent) : 0;
} }
}, },
methods: { methods: {
showPriceInfoPopups() {
console.log('showPriceInfoPopup called');
this.showPriceInfoPopup = true
},
closePriceInfoPopup() {
console.log('closePriceInfoPopup called');
this.showPriceInfoPopup = false
},
changeTo(e){ changeTo(e){
this.value = e this.value = e
if(e==2){ if(e==2){
@ -411,37 +446,16 @@ export default {
const categoryId = this.categories[this.currentCategory]?.id const categoryId = this.categories[this.currentCategory]?.id
const item = this.allProducts[categoryId]?.[index] const item = this.allProducts[categoryId]?.[index]
if (!item) return if (!item) return
const currentQuantity = item.quantity || 0
let newQuantity = currentQuantity + delta
if (newQuantity < 0) newQuantity = 0
// 01
if (currentQuantity === 0 && delta > 0 && !this.shownRuleItems.has(item.id)) {
//
if (item.shopCion) {
this.pendingBrandIndex = index
this.getGoodsBrandList(item.shopCion)
this.showBrandPopup = true
return
}
//
this.pendingAddItem = { categoryId, index, item }
this.showRulesWithCountdown(item)
return
}
// 0
if (item.shopCion && currentQuantity === 0 && delta > 0) {
// 0
if (item.isPin === 'Y' && (item.quantity || 0) === 0 && delta > 0) {
this.pendingBrandIndex = index this.pendingBrandIndex = index
this.getGoodsBrandList(item.shopCion)
this.showBrandPopup = true
this.isWaitingForBrandSelection = true;
this.showRules(item); //
return return
} }
//
this.$set(item, 'quantity', newQuantity)
let newQuantity = (item.quantity || 0) + delta
if (newQuantity < 0) newQuantity = 0
this.$set(item, 'quantity', newQuantity)
}, },
// //
showRules(item) { showRules(item) {
@ -455,32 +469,6 @@ export default {
this.showRulePopup = true this.showRulePopup = true
}) })
}, },
//
showRulesWithCountdown(item) {
//
this.$api('getGoodsRecycleRule', { goodsId: item.id }, res => {
if (res.code === 200 && res.result) {
this.ruleHtml = res.result
} else {
this.ruleHtml = '<p>暂无回收规则</p>'
}
this.showRulePopup = true
this.startRuleCountdown()
})
},
//
startRuleCountdown() {
this.ruleCountdown = 3
this.ruleCountdownTimer = setInterval(() => {
this.ruleCountdown--
if (this.ruleCountdown <= 0) {
clearInterval(this.ruleCountdownTimer)
this.ruleCountdownTimer = null
}
}, 1000)
},
showMore() { showMore() {
uni.showToast({ uni.showToast({
title: '更多规则请咨询客服', title: '更多规则请咨询客服',
@ -488,9 +476,16 @@ export default {
}) })
}, },
submitOrder() { submitOrder() {
if (this.totalCount === 0) {
if (this.totalCount < 3) {
uni.showToast({
title: '各品类混合需要满3件才能回收哦',
icon: 'none'
})
return
}
if (Number(this.totalPrice) < this.minMoney) {
uni.showToast({ uni.showToast({
title: '请选择要回收的物品',
title: `回收总价需满${this.minMoney}元才能预约`,
icon: 'none' icon: 'none'
}) })
return return
@ -540,6 +535,9 @@ export default {
}, },
closeBrandPopup() { closeBrandPopup() {
this.showBrandPopup = false this.showBrandPopup = false
//
this.pendingBrandIndex = null;
this.isWaitingForBrandSelection = false;
}, },
scrollToLetter(letter) { scrollToLetter(letter) {
this.currentLetter = letter this.currentLetter = letter
@ -587,29 +585,19 @@ export default {
this.showRulePopup = true this.showRulePopup = true
}, },
closeRulePopup() { closeRulePopup() {
//
if (this.ruleCountdown > 0) {
uni.showToast({
title: `请阅读完规则,还需等待${this.ruleCountdown}`,
icon: 'none'
})
return
}
this.showRulePopup = false
this.ruleCountdown = 0
if (this.ruleCountdownTimer) {
clearInterval(this.ruleCountdownTimer)
this.ruleCountdownTimer = null
}
//
if (this.pendingAddItem) {
const { categoryId, index, item } = this.pendingAddItem
this.$set(item, 'quantity', 1)
//
this.shownRuleItems.add(item.id)
this.pendingAddItem = null
this.showRulePopup = false;
//
if (this.isWaitingForBrandSelection) {
this.isWaitingForBrandSelection = false; //
const categoryId = this.categories[this.currentCategory]?.id;
const item = this.allProducts[categoryId]?.[this.pendingBrandIndex];
if (item?.isPin === 'Y') {
this.getGoodsBrandList(item.shopCion);
this.showBrandPopup = true; //
} else {
//
this.pendingBrandIndex = null;
}
} }
}, },
loadMoreGoods() { loadMoreGoods() {
@ -634,6 +622,7 @@ export default {
}, },
openBrandConfirm(brand) { openBrandConfirm(brand) {
this.brandConfirmInfo = { this.brandConfirmInfo = {
id: brand.id,
logo: brand.logo, logo: brand.logo,
name: brand.name name: brand.name
} }
@ -645,19 +634,13 @@ export default {
confirmBrand() { confirmBrand() {
this.showBrandConfirm = false this.showBrandConfirm = false
this.showBrandPopup = false this.showBrandPopup = false
// +1
// +1ID
if (this.pendingBrandIndex !== null) { if (this.pendingBrandIndex !== null) {
const categoryId = this.categories[this.currentCategory]?.id const categoryId = this.categories[this.currentCategory]?.id
const item = this.allProducts[categoryId]?.[this.pendingBrandIndex] const item = this.allProducts[categoryId]?.[this.pendingBrandIndex]
if (item) { if (item) {
//
if ((item.quantity || 0) === 0 && !this.shownRuleItems.has(item.id)) {
this.pendingAddItem = { categoryId, index: this.pendingBrandIndex, item }
this.showRulesWithCountdown(item)
} else {
//
this.$set(item, 'quantity', 1)
}
this.$set(item, 'quantity', 1)
this.$set(item, 'pinId', this.brandConfirmInfo.id);
} }
this.pendingBrandIndex = null this.pendingBrandIndex = null
} }
@ -670,6 +653,7 @@ export default {
// //
const firstChar = this.getPinyinFirstLetter(item.name) const firstChar = this.getPinyinFirstLetter(item.name)
return { return {
id: item.id,
logo: item.image || '/static/brand/alexander.png', logo: item.image || '/static/brand/alexander.png',
name: item.name, name: item.name,
letter: firstChar letter: firstChar
@ -690,14 +674,9 @@ export default {
return key.charAt(0).toUpperCase() return key.charAt(0).toUpperCase()
} }
} }
let index = this.brandIndexList.indexOf(firstChar.toUpperCase())
if (index != -1) {
return this.brandIndexList[index]
}
return '#' return '#'
}, },
}, },
created() { created() {
this.currentCategory = 0 this.currentCategory = 0
@ -751,11 +730,6 @@ export default {
uni.$off('bannerListUpdated') uni.$off('bannerListUpdated')
// //
uni.$off('clearRecycleOrderData') uni.$off('clearRecycleOrderData')
//
if (this.ruleCountdownTimer) {
clearInterval(this.ruleCountdownTimer)
this.ruleCountdownTimer = null
}
}, },
onShow() { onShow() {
const id = getApp().globalData.targetRecycleCategoryId const id = getApp().globalData.targetRecycleCategoryId
@ -835,10 +809,11 @@ export default {
.banner { .banner {
background: linear-gradient(135deg, #ff9500,#ff5e00); background: linear-gradient(135deg, #ff9500,#ff5e00);
position: relative; position: relative;
height: 350rpx;
z-index: 1; z-index: 1;
image { image {
width: 100%; width: 100%;
height: 100%;
height: 90%;
} }
} }
@ -871,11 +846,11 @@ export default {
} }
.category-item { .category-item {
position: relative; position: relative;
padding: 30rpx 10rpx;
padding: 28rpx 20rpx;
text-align: center; text-align: center;
font-family: PingFang SC; font-family: PingFang SC;
font-weight: 600; font-weight: 600;
font-size: 30rpx;
font-size: 15px;
line-height: 100%; line-height: 100%;
letter-spacing: 0px; letter-spacing: 0px;
color: #666; color: #666;
@ -884,10 +859,16 @@ export default {
position: absolute; position: absolute;
top: 15rpx; top: 15rpx;
right: 15rpx; right: 15rpx;
width: 12rpx;
height: 12rpx;
min-width: 32rpx;
height: 32rpx;
padding: 0 6rpx;
background: #ff7a0e; background: #ff7a0e;
border-radius: 50%;
border-radius: 16rpx;
color: #fff;
font-size: 20rpx;
text-align: center;
line-height: 32rpx;
box-sizing: border-box;
} }
&.active { &.active {
@ -914,7 +895,7 @@ export default {
.goods-content { .goods-content {
flex: 1; flex: 1;
height: 100%; height: 100%;
padding: 0 20rpx;
padding: 0 30rpx;
background: #ffffff; background: #ffffff;
width: 70%; width: 70%;
margin: 1rpx; margin: 1rpx;
@ -937,8 +918,8 @@ export default {
border-bottom: 1rpx solid #f5f5f5; border-bottom: 1rpx solid #f5f5f5;
.goods-item-img { .goods-item-img {
width: 160rpx;
height: 180rpx;
width: 120rpx;
height: 120rpx;
border-radius: 24rpx; border-radius: 24rpx;
background: #f8f8f8; background: #f8f8f8;
margin-right: 28rpx; margin-right: 28rpx;
@ -954,7 +935,6 @@ export default {
} }
.goods-header { .goods-header {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 10rpx; margin-bottom: 10rpx;
@ -969,10 +949,32 @@ export default {
vertical-align: middle; vertical-align: middle;
color: #333; color: #333;
font-weight: bold; font-weight: bold;
overflow:hidden; //
text-overflow:ellipsis; //
white-space:nowrap; //
width: 160rpx;
flex-shrink: 1;
flex-grow: 1;
}
.brand-check-placeholder {
flex-shrink: 0;
margin-left: 10rpx;
}
.brand-check {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
border: 1px solid #f8a01d;
border-radius: 8rpx;
color: #ff7a0e;
font-family: PingFang SC;
font-weight: 400;
font-size: 12px;
padding: 4rpx 10rpx;
line-height: 1;
white-space: nowrap;
text {
margin-right: 4rpx;
}
} }
.goods-desc { .goods-desc {
@ -980,6 +982,9 @@ export default {
color: #999; color: #999;
display: block; display: block;
margin-bottom: 20rpx; margin-bottom: 20rpx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
} }
.goods-info { .goods-info {
@ -1024,7 +1029,7 @@ export default {
justify-content: center; justify-content: center;
font-size: 28rpx; font-size: 28rpx;
color: #666; color: #666;
background: #f8f8f8;
background: #ffffff;
border: none; border: none;
border-radius: 50%; border-radius: 50%;
@ -1045,41 +1050,22 @@ export default {
} }
} }
.brand-check {
// margin-top: 20rpx;
// margin:0 auto;
.rules-link {
margin-top: 20rpx;
}
.rules-link .rules {
display: flex; display: flex;
flex-direction: row;
align-items: center; align-items: center;
// justify-content: center;
border: 1px solid #f8a01d;
width: 40%;
// background: #fff7f0;
border-radius: 8rpx;
color: #ff7a0e;
font-family: PingFang SC; font-family: PingFang SC;
font-weight: 400; font-weight: 400;
font-size: 12px; font-size: 12px;
line-height: 140%; line-height: 140%;
letter-spacing: 0%; letter-spacing: 0%;
text {
// margin-right: 8rpx;
}
color: #666;
} }
} }
.rules-link{
flex-shrink: 0;
.rules{
font-family: PingFang SC;
font-weight: 400;
font-size: 12px;
line-height: 140%;
letter-spacing: 0%;
}
}
.other-unrecycle-card { .other-unrecycle-card {
display: flex; display: flex;
align-items: center; align-items: center;
@ -1090,8 +1076,8 @@ export default {
margin: 30rpx 0 0 0; margin: 30rpx 0 0 0;
} }
.other-unrecycle-img { .other-unrecycle-img {
width: 160rpx;
height: 180rpx;
width: 120rpx;
height: 120rpx;
border-radius: 24rpx; border-radius: 24rpx;
background: #f8f8f8; background: #f8f8f8;
margin-right: 28rpx; margin-right: 28rpx;
@ -1113,13 +1099,9 @@ export default {
word-break: break-all; word-break: break-all;
white-space: normal; white-space: normal;
overflow: visible; overflow: visible;
overflow:hidden; //
text-overflow:ellipsis; //
white-space:nowrap; //
width: 280rpx;
} }
.other-unrecycle-desc { .other-unrecycle-desc {
font-size: 20rpx;
font-size: 24rpx;
color: #999; color: #999;
margin-bottom: 12rpx; margin-bottom: 12rpx;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -1140,14 +1122,13 @@ export default {
height: 60rpx; height: 60rpx;
margin-left: 24rpx; margin-left: 24rpx;
border-radius: 50%; border-radius: 50%;
background: #f5f5f5;
color: #ccc;
background: #fff;
color: #666;
font-size: 36rpx; font-size: 36rpx;
border: none; border: none;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
pointer-events: none;
} }
.fixed-bottom-wrap { .fixed-bottom-wrap {
@ -1385,7 +1366,7 @@ export default {
justify-content: center; justify-content: center;
font-size: 32rpx; font-size: 32rpx;
color: #666; color: #666;
background: #f5f5f5;
background: #ffffff;
border: none; border: none;
border-radius: 50%; border-radius: 50%;
&::after { &::after {
@ -1672,14 +1653,6 @@ export default {
&:active { &:active {
opacity: 0.9; opacity: 0.9;
} }
&.disabled {
background: #ccc;
color: #999;
box-shadow: none;
&:active {
opacity: 1;
}
}
} }
.rule-popup-close { .rule-popup-close {
position: absolute; position: absolute;
@ -1729,11 +1702,21 @@ export default {
margin-bottom: 24rpx; margin-bottom: 24rpx;
} }
.pickup-confirm-content { .pickup-confirm-content {
width: 100%;
font-size: 26rpx; font-size: 26rpx;
color: #333; color: #333;
text-align: left; text-align: left;
line-height: 1.7; line-height: 1.7;
margin-bottom: 36rpx; margin-bottom: 36rpx;
.confirm-item {
margin-bottom: 24rpx;
&:last-child {
margin-bottom: 0;
}
}
.confirm-item-red {
color: red;
}
} }
.pickup-confirm-btn-row { .pickup-confirm-btn-row {
width: 100%; width: 100%;
@ -1861,4 +1844,77 @@ export default {
color: #fff; color: #fff;
border: none; border: none;
} }
.price-info-popup-mask {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: rgba(0,0,0,0.4);
z-index: 6000;
display: flex;
align-items: center;
justify-content: center;
}
.price-info-popup {
width: 85vw;
max-width: 600rpx;
background: #fff;
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.12);
display: flex;
flex-direction: column;
align-items: center;
position: relative;
padding: 40rpx 40rpx;
.price-info-popup-title {
font-size: 34rpx;
color: #333;
font-weight: bold;
text-align: center;
margin-bottom: 30rpx;
}
.price-info-popup-content {
width: 100%;
max-height: 50vh;
.price-info-section {
margin-bottom: 30rpx;
&:last-child {
margin-bottom: 0;
}
.price-info-heading {
font-size: 28rpx;
color: #333;
font-weight: 500;
margin-bottom: 15rpx;
}
.price-info-text {
font-size: 26rpx;
color: #666;
line-height: 1.6;
}
}
}
.price-info-popup-btn {
width: 100%;
height: 88rpx;
background: linear-gradient(to right, #ffd01e, #ff8917);
border-radius: 44rpx;
color: #fff;
font-size: 32rpx;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
border: none;
margin-top: 40rpx;
box-shadow: 0 4rpx 16rpx rgba(255, 156, 0, 0.08);
&::after {
border: none;
}
&:active {
opacity: 0.9;
}
}
}
</style> </style>

+ 80
- 237
pages/subcomponent/about.vue View File

@ -1,258 +1,101 @@
<template> <template>
<view class="about-container">
<!-- 顶部导航栏 -->
<view class="nav-bar" :style="{ height: (statusBarHeight + 88) + 'rpx', paddingTop: statusBarHeight + 'px' }">
<view class="back" @tap="goBack">
<uni-icons type="left" size="20"></uni-icons>
</view>
<text class="title">关于我们</text>
</view>
<view class="main-card" :style="{marginTop: (statusBarHeight + 88) + 'rpx'}">
<rich-text :nodes="sbk_cion"
style="padding: 20rpx 0;"/>
</view>
<!-- <view class="main-card" :style="{marginTop: (statusBarHeight + 88) + 'rpx'}">
<text class="main-title">瀚海回收</text>
<text class="main-desc">瀚海回收致力于打造一个便捷高效且环保的旧衣回收平台为用户提供符合环保理念的旧衣回收解决方案助力资源循环利用和可持续发展</text>
<view class="service-tags">
<view class="tag-item">
<image class="tag-icon" src="/static/about/free.png" mode="aspectFit"></image>
<text class="tag-text">免费寄</text>
</view>
<view class="tag-item">
<image class="tag-icon" src="/static/about/inspect.png" mode="aspectFit"></image>
<text class="tag-text">逐件验</text>
</view>
<view class="tag-item">
<image class="tag-icon" src="/static/about/fast.png" mode="aspectFit"></image>
<text class="tag-text">秒到账</text>
</view>
<view class="tag-item">
<image class="tag-icon" src="/static/about/eco.png" mode="aspectFit"></image>
<text class="tag-text">助环保</text>
</view>
</view>
<view class="service-section">
<view class="section-title">
<image class="section-icon" src="/static/home/② 快递上门.png" mode="aspectFit"></image>
<text>免费寄</text>
</view>
<text class="section-desc">我们为用户提供一个便捷且无负担的旧衣回收服务用户只需在平台上提交旧衣回收申请我们会提供免费的上门取件服务无论您有多少衣物想要处理都可以轻松寄出让旧衣变资源</text>
<image class="section-img" src="/static/回收/回收规则.png" mode="aspectFit"></image>
<view class="about-container">
<!-- 顶部导航栏 -->
<view class="nav-bar" :style="{height: (statusBarHeight + 88) + 'rpx', paddingTop: statusBarHeight + 'px'}">
<view class="back" @tap="goBack">
<uni-icons type="left" size="20"></uni-icons>
</view> </view>
<view class="service-section">
<view class="section-title">
<image class="section-icon" src="/static/home/③ 透明质检.png" mode="aspectFit"></image>
<text>逐件验</text>
</view>
<text class="section-desc">我们对每一件回收的旧衣进行严格的逐件验收确保衣物符合回收标准我们的专业团队会仔细检查每一件衣物的状况包括是否破损是否有严重污染异味等只有符合要求的旧衣才会进入后续的处理流程以保证回收质量和效率</text>
<image class="section-img" src="/static/回收/回收规则.png" mode="aspectFit"></image>
</view>
<view class="service-section">
<view class="section-title">
<image class="section-icon" src="/static/home/④ 现金打款.png" mode="aspectFit"></image>
<text>秒到账</text>
</view>
<text class="section-desc">我们深知用户对资金结算的及时性要求因此建立了高效的结算系统订单成功推单回收订单后佣金会及时到账无论订单有多少件我们都承诺在最短时间内为您发放奖励确保用户收益的及时性和稳定性</text>
<image class="section-img" src="/static/回收/回收规则.png" mode="aspectFit"></image>
</view>
<view class="service-section">
<view class="section-title">
<image class="section-icon" src="/static/home/碳循再生.png" mode="aspectFit"></image>
<text>助环保</text>
</view>
<text class="section-desc">我们的使命是通过旧衣回收推动环保事业的发展实现资源的循环再利用我们始终以环保为核心理念不断优化服务流程提高用户体验以实现经济效益与环保效益的双赢加入我们一起为环保事业贡献力量让旧衣焕发新的价值</text>
<image class="section-img" src="/static/回收/回收规则.png" mode="aspectFit"></image>
</view>
<view class="about-footer">
<view class="footer-divider"></view>
<text class="footer-text">如有任何问题或建议请随时与我们联系我们将竭诚为您服务</text>
</view>
</view> -->
<text class="title">关于我们</text>
</view>
<!-- 主卡片 -->
<view class="main-card" :style="{marginTop: (statusBarHeight + 88) + 'rpx'}">
<!-- 富文本内容 -->
<rich-text :nodes="memberTextContent" class="rich-text-content"></rich-text>
</view> </view>
</view>
</template> </template>
<script> <script>
import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js' import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
export default { export default {
mixins: [pullRefreshMixin],
data() {
return {
statusBarHeight: 0
}
},
onLoad() {
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight
},
computed: {
sbk_cion() {
console.log(getApp().globalData.configData, 'getApp().globalData.configData')
const item = getApp().globalData.configData.find(i => i.keyName === 'member_text')
return item ? item.keyContent : ''
},
mixins: [pullRefreshMixin],
data() {
return {
statusBarHeight: 0
}
},
computed: {
memberTextContent() {
console.log(getApp().globalData.configData, 'about-getApp().globalData.configData')
const item = getApp().globalData.configData.find(i => i.keyName === 'member_text')
return item ? item.keyContent : ''
}
},
onLoad() {
this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight
},
methods: {
goBack() {
uni.navigateBack();
}, },
methods: {
goBack() {
uni.navigateBack();
},
async onRefresh() {
//
await new Promise(resolve => setTimeout(resolve, 1000))
this.stopPullRefresh()
}
async onRefresh() {
//
await new Promise(resolve => setTimeout(resolve, 1000))
this.stopPullRefresh()
} }
}
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.about-container { .about-container {
min-height: 100vh;
background: linear-gradient(180deg, #fff3db 0%, #fffefb 30%);
padding-bottom: 40rpx;
min-height: 100vh;
background: linear-gradient(180deg, #fff3db 0%, #fffefb 30%);
padding-bottom: 40rpx;
} }
.nav-bar { .nav-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 999;
display: flex;
align-items: center;
background: #fffbe6;
padding: 0 30rpx;
.back {
padding: 20rpx;
margin-left: -20rpx;
}
.title {
flex: 1;
text-align: center;
font-family: PingFang SC;
font-weight: 500;
font-size: 16px;
line-height: 140%;
letter-spacing: 0%;
text-align: center;
vertical-align: middle;
font-weight: 500;
color: #222;
}
}
.main-card {
background: #ffffff;
border-radius: 36rpx;
box-shadow: 0 8rpx 32rpx rgba(255, 156, 0, 0.08);
margin: 32rpx 24rpx 0 24rpx;
padding: 40rpx 32rpx 32rpx 32rpx;
display: flex;
flex-direction: column;
align-items: stretch;
}
.main-title {
font-size: 32rpx;
font-weight: bold;
color: #222;
margin-bottom: 18rpx;
}
.main-desc {
font-size: 26rpx;
color: #444;
margin-bottom: 32rpx;
line-height: 1.7;
}
.service-tags {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24rpx 24rpx;
margin-bottom: 36rpx;
}
.tag-item {
background: #fff8ea;
border-radius: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(255, 156, 0, 0.06);
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
padding: 28rpx 0 18rpx 0;
min-height: 90rpx;
gap: 12rpx;
}
.tag-icon {
width: 40rpx;
height: 40rpx;
margin: 0;
}
.tag-text {
font-size: 26rpx;
color: #222;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 999;
display: flex;
align-items: center;
background: #fffbe6;
padding: 0 30rpx;
.back {
padding: 20rpx;
margin-left: -20rpx;
}
.title {
flex: 1;
text-align: center;
font-family: PingFang SC;
font-weight: 500; font-weight: 500;
}
.service-section {
margin-bottom: 36rpx;
}
.section-title {
display: flex;
align-items: center;
font-size: 28rpx;
font-weight: bold;
color: #222;
margin-bottom: 12rpx;
.section-icon {
width: 32rpx;
height: 32rpx;
margin-right: 12rpx;
}
}
.section-desc {
font-size: 24rpx;
color: #666;
line-height: 1.7;
margin-bottom: 18rpx;
}
.section-img {
width: 80%;
margin: 0 auto;
display: block;
border-radius: 24rpx;
box-shadow: 0 2rpx 8rpx rgba(255, 156, 0, 0.04);
}
.about-footer {
margin-top: 24rpx;
font-size: 16px;
line-height: 140%;
letter-spacing: 0%;
text-align: center; text-align: center;
vertical-align: middle;
font-weight: 500;
color: #222;
}
} }
.footer-divider {
width: 100%;
height: 1rpx;
background: #f0f0f0;
margin: 32rpx 0 18rpx 0;
}
.footer-text {
color: #bcbcbc;
font-size: 24rpx;
margin-bottom: 18rpx;
}
</style>
.main-card {
background: #ffffff;
border-radius: 36rpx;
box-shadow: 0 8rpx 32rpx rgba(255, 156, 0, 0.08);
margin: 32rpx 24rpx 0 24rpx;
padding: 40rpx 32rpx 32rpx 32rpx;
display: flex;
flex-direction: column;
align-items: stretch;
}
.rich-text-content {
width: 100%;
line-height: 1.7;
font-size: 26rpx;
color: #444;
}
</style>

+ 0
- 19
pages/subcomponent/admin_faq.vue View File

@ -29,11 +29,6 @@
<button class="btn-outline" @tap="callService">客服电话</button> <button class="btn-outline" @tap="callService">客服电话</button>
<button class="btn-gradient" open-type="contact">联系在线客服</button> <button class="btn-gradient" open-type="contact">联系在线客服</button>
</view> </view>
<email-popup
:show="showEmailPopup"
@close="handleCloseEmailPopup"
@copyEmail="copyEmail"
/>
<!-- 客服电话底部弹窗 --> <!-- 客服电话底部弹窗 -->
<view v-if="showPhonePopup" class="phone-popup"> <view v-if="showPhonePopup" class="phone-popup">
<view class="popup-mask" @tap="closePhonePopup"></view> <view class="popup-mask" @tap="closePhonePopup"></view>
@ -55,17 +50,14 @@
<script> <script>
import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js' import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
import emailPopup from '@/wxcomponents/email-popup/email-popup.vue'
export default { export default {
mixins: [pullRefreshMixin], mixins: [pullRefreshMixin],
components: { emailPopup },
data() { data() {
return { return {
statusBarHeight: 0, statusBarHeight: 0,
navBarHeight: 0, // px navBarHeight: 0, // px
navBarHeightRpx: 0, // rpx navBarHeightRpx: 0, // rpx
showEmailPopup: false,
showPhonePopup: false, showPhonePopup: false,
faqList: [] faqList: []
} }
@ -96,8 +88,6 @@ export default {
await new Promise(resolve => setTimeout(resolve, 1000)) await new Promise(resolve => setTimeout(resolve, 1000))
uni.stopPullRefresh() uni.stopPullRefresh()
}, },
openEmailPopup() { this.showEmailPopup = true },
handleCloseEmailPopup() { this.showEmailPopup = false },
navigateBack() { uni.navigateBack() }, navigateBack() { uni.navigateBack() },
callService() { callService() {
// //
@ -116,15 +106,6 @@ export default {
uni.showToast({ title: '暂无客服电话', icon: 'none' }); uni.showToast({ title: '暂无客服电话', icon: 'none' });
} }
}, },
copyEmail(){
if (this.phone) {
uni.makePhoneCall({
phoneNumber: this.phone //
});
}else{
uni.showToast({ title: '暂无微信客服', icon: 'none' });
}
},
getQuestionList() { getQuestionList() {
this.$api('getQuestionList', {}, res => { this.$api('getQuestionList', {}, res => {
if (res && res.success && res.result && res.result.records) { if (res && res.success && res.result && res.result.records) {


+ 10
- 4
pages/subcomponent/pickup.vue View File

@ -319,10 +319,16 @@ export default {
uni.showToast({ title: '请选择回收物品', icon: 'none' }) uni.showToast({ title: '请选择回收物品', icon: 'none' })
return return
} }
const list = this.selectedItems.map(item => ({
shopId: item.id,
num: item.quantity
}))
const list = this.selectedItems.map(item => {
const orderItem = {
shopId: item.id,
num: item.quantity
};
if (item.pinId) {
orderItem.pinId = item.pinId;
}
return orderItem;
});
console.log({ console.log({
addressId: this.addressId, addressId: this.addressId,
strTime: this.selectedTime, strTime: this.selectedTime,


Loading…
Cancel
Save