Files
wagoo-douy3/src/pages/client/mine/index.vue
2026-04-10 15:47:09 +08:00

1054 lines
22 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="mine-container">
<view class="mineGroundImgView">
<image :src="`${imgPrefix}mine-ground.png`" mode="aspectFill" class="groundImg"></image>
<view class="userInfoView">
<view class="userLeft"
@click="userInfo.userID ? jumpTo('/pages/client/mine/userInfo') : jumpTo('/pages/client/auth/index')">
<image
:src="userInfo.userID && userInfo.avatar ? userInfo.avatar : `${imgPrefix}home-head.png`"
class="userAvatar" mode="aspectFill" />
<view style="margin-left: 16rpx;">
<view>
<view class="userName">
{{ userInfo.userID && userInfo.username ? userInfo.username : '嗨,你好呀' }}
</view>
</view>
<view class="userPhone" v-if="userInfo.phone">
{{ userInfo.phone }}
</view>
<!-- <view class="vipWrapper">
<image class="lableImg" :src="`${imgPrefix}home-vipLabel.png`" mode=""></image>
v{{ userInfo.vipLevel || 1 }}会员
</view> -->
</view>
</view>
<view class="logoutBtn" @click="showLogoutModal = true">
退出登录
</view>
<!-- <view class="userRight">
<view class="userRgihtItemView" @click="jumpTo('/pages/client/recharge/index?tab=points')">
<view class="num">
{{ displayTotalPoints }}
</view>
<view class="text">
积分
</view>
</view>
<view class="userRgihtItemView" @click="jumpTo(`/pages/client/recharge/my-card?user_id=${userInfo.id}`) ">
<view class="num">
{{ displayMembershipCount }}
</view>
<view class="text">
卡包
</view>
</view>
<view class="userRgihtItemView" @click="jumpTo(`/pages/client/coupon/list`)">
<view class="num">
{{ displayCouponCount }}
</view>
<view class="text">
券包
</view>
</view>
</view> -->
</view>
</view>
<!-- <view class="myPriceView">
<view style="display: flex;align-items: center;">
<image :src="`${imgPrefix}accountPrice.png`" class="priceImg"></image>
<text class="fs-24">我的余额{{ displayWalletBalance !== '' ? displayWalletBalance : 0 }}</text>
</view>
<view
@click="jumpTo(`/pages/client/recharge/index?user_id=${userInfo.userID}`)"
class="fs-24">
去充值
<image :src="`${imgPrefix}right-arrow.png`" class="arrowImg"></image>
</view>
</view> -->
<!-- <view class="menuView">
<view class="menuItem" @click="jumpTo('/pages/client/petOrder/index')">
<image class="menuImg" :src="`${imgPrefix}mine-resaOrder.png`"></image>
<view class="menuTitle">
服务订单
</view>
</view>
<view class="menuItem" @click="jumpTo('/pages/client/order/list')">
<image class="menuImg" :src="`${imgPrefix}mine-shopOrder.png`"></image>
<view class="menuTitle">
商城订单
</view>
</view>
<view class="menuItem"
@click="jumpTo(`/pages/client/recharge/membership-code?yaoqing_code=${userInfo.yaoqing_code}&member_id=${userInfo.id}`)">
<image class="menuImg" :src="`${imgPrefix}home-invite .png`"></image>
<view class="menuTitle">
邀请有礼
</view>
</view>
</view> -->
<!-- <view class="mine-slide">
<view class="recharge-slide">
<view class="scroll">
<view class="card-roll">
<image
class="file-pet"
:src="`${imgPrefix}myRecharge.png`"
mode="widthFix"
/>
<view
class="recharge"
@click="
jumpTo(
`/pages/client/recharge/index?wallet_id=${walletList.wallet_id}&user_id=${walletList.user_id}&balance=${walletList.balance}`
)
"
>
</view>
<view
class="use-record"
@click="
jumpTo(
`/pages/client/recharge/use-list?wallet_id=${walletList.wallet_id}&user_id=${walletList.user_id}`
)
"
>
</view>
</view>
</view>
</view>
</view> -->
<!-- <view class="meber-m" @click="jumpTo(`/pages/richText/member-interests?userId=${userInfo.id}&nick_name=${userInfo.nick_name}`)">
<image class="meb-im" :src="`${imgPrefix}member-vip.png`" />
</view> -->
<view class="navView">
<view class="navItem" @click="jumpTo('/pages/client/order/list')">
<view class="navTitle">
商城订单
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
<!-- <view class="navItem" @click="jumpTo('/pageHome/selectPet/index')">
<view class="navTitle">
我的宠物
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view> -->
<view class="navItem" @click="jumpTo('/pageHome/selectAddress/index')">
<view class="navTitle">
收货地址
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
<view class="navItem" @click="showContact">
<view class="navTitle">
反馈建议
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
<view class="navItem" @click="jumpTo('/pages/client/news/index')">
<view class="navTitle">
系统消息
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
<view class="navItem" @click="jumpTo('/pages/client/mine/qualification')">
<view class="navTitle">
服务资质
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
<!-- <view class="navItem" @click="jumpTo(`/pages/client/mine/aboutus`)">
<view class="navTitle">
关于平台
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view> -->
<view class="navItem" style="border: none;" v-if="userInfo.phone" @click="showLogoutModal = true">
<view class="navTitle">
退出登录
</view>
<image class="navArrow" :src="`${imgPrefix}right-arrow.png`"></image>
</view>
</view>
<pop-up-modal v-if="showLogoutModal" content="确定要退出登录吗?" @cancel="showLogoutModal = false" @confirm="logout" />
<contact-modal v-if="showContactModal" :data="configInfo" @close="showContactModal = false" />
<!-- 可拖动联系客服组件 -->
<DraggableContact ref="draggableContact" :onClick="handleContactClick" />
<WeChatCopyModal ref="wechatCopyModal" />
</view>
</template>
<script>
import CommonCell from "@/components/CommonCell.vue";
import PopUpModal from "../../../components/PopUpModal.vue";
import ContactModal from "@/components/ContactModal.vue";
import WeChatCopyModal from "@/components/WeChatCopyModal.vue";
import DraggableContact from "@/components/DraggableContact.vue";
import {
loginOut,
getUserInfo,
} from "../../../api/user";
import appConfig from "@/constants/app.config";
import {
jumpToWeChat,
imgPrefix
} from "@/utils/common";
export default {
components: {
CommonCell,
PopUpModal,
ContactModal,
WeChatCopyModal,
DraggableContact,
},
data() {
return {
imageList: [{
id: "1",
image: `${imgPrefix}member-vip.png`,
},
{
id: "2",
image: `${imgPrefix}invite-friend.png`,
},
{
id: "3",
image: `${imgPrefix}Carousel.png`,
},
],
progress: 8000,
isLogin: true,
showLogoutModal: false,
showContactModal: false,
couponList: '',
configInfo: {
kefu_pic: "",
kefu_time: "",
},
appConfig,
imgPrefix,
};
},
computed: {
userInfo() {
return this.$store.state?.user?.userInfo || {};
},
// 显示积分未登录或401时展示0
displayTotalPoints() {
const userInfo = this.$store.state?.user?.userInfo;
if (!userInfo) return 0;
const points = userInfo.totalPoints;
return points !== undefined && points !== null ? points : 0;
},
// 显示卡包数量未登录或401时展示0
displayMembershipCount() {
const userInfo = this.$store.state?.user?.userInfo;
if (!userInfo) return 0;
const count = userInfo.membershipInstanceCount;
return count !== undefined && count !== null ? count : 0;
},
// 显示券包数量未登录或401时展示0
displayCouponCount() {
const userInfo = this.$store.state?.user?.userInfo;
if (!userInfo) return 0;
const count = userInfo.couponCount;
return count !== undefined && count !== null ? count : 0;
},
// 显示余额
displayWalletBalance() {
const userInfo = this.$store.state?.user?.userInfo;
if (!userInfo) return '';
const balance = userInfo.walletBalance;
return balance !== undefined && balance !== null ? balance : '';
},
},
options: {
styleIsolation: "shared",
},
methods: {
// 切换tab时刷新数据不需要调用 getUserInfo因为 index/index.vue 的 onShow 已经统一调用了)
onShowFun() {
// getUserInfo 接口已在 index/index.vue 的 onShow 中统一调用,这里不需要重复调用
// 如果需要从其他页面返回时获取最新数据,可以在 index/index.vue 的 onShow 中调用
},
jumpTo(url) {
uni.navigateTo({
url,
});
},
shoppingMall() {
// this.$emit("changeTab", [pageId]);
uni.reLaunch({
url: "/pages/client/index/index?activePageId=shopPage",
});
},
logout() {
loginOut();
this.showLogoutModal = false;
// 清除Vuex中的用户状态
this.$store.dispatch('user/deleteToken');
this.$store.dispatch('user/clearUserInfo');
// 清除本地缓存
uni.clearStorageSync();
uni.reLaunch({
url: "/pages/client/auth/index",
});
},
showContact() {
jumpToWeChat();
// this.getConfig();
// this.showContactModal = true;
},
// 跳转微信客服 - 使用自定义弹窗(与商城页面一致)
handleContactClick() {
if (this.$refs.wechatCopyModal) {
this.$refs.wechatCopyModal.show({
title: '请添加客服号',
weChatCode: 'Wagoo2025'
});
}
},
},
};
</script>
<style lang="scss" scoped>
.mine-container {
background-color: #ffecf3;
height: 100%;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
height: calc(100vh - #{$app_tabbar_height + 26});
padding-top: 0;
.mineGroundImgView {
position: relative;
margin-top: -88rpx;
.groundImg {
width: 100%;
height: 552rpx;
padding-top: 88rpx;
box-sizing: content-box;
}
}
.userInfoView {
border-radius: 16rpx;
width: calc(100vw - 40rpx);
display: flex;
justify-content: space-between;
align-items: center;
padding: 28rpx 32rpx;
background-color: #fff;
margin: auto;
box-sizing: border-box;
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: -30rpx;
.userLeft {
display: flex;
flex: 1;
align-items: center;
.userAvatar {
width: 92rpx;
height: 92rpx;
border-radius: 50%;
}
.vipWrapper {
background-color: #FF19A0;
padding: 4rpx 8rpx;
border-radius: 50px;
font-size: 20rpx;
color: #fff;
margin-top: 16rpx;
display: inline-block;
.lableImg {
width: 24rpx;
height: 20rpx;
margin-right: 4rpx;
}
}
.userName {
font-size: 28rpx;
font-weight: 500;
}
.userPhone {
font-size: 24rpx;
color: #999;
margin-top: 8rpx;
}
}
.logoutBtn {
background: linear-gradient(270deg, #FF19A0 0%, #FF6BB3 100%);
color: #fff;
padding: 16rpx 32rpx;
border-radius: 50rpx;
font-size: 24rpx;
font-weight: 500;
}
.userRight {
display: flex;
justify-content: flex-end;
align-items: center;
flex: 1;
text-align: center;
gap: 60rpx;
.userRgihtItemView {
.num {
font-size: 28rpx;
}
.text {
font-size: 20rpx;
margin-top: 16rpx;
}
}
}
}
.myPriceView {
display: flex;
align-items: center;
justify-content: space-between;
background-color: #fff;
border-radius: 16rpx;
padding: 20rpx;
width: calc(100vw - 40rpx);
margin: auto;
margin-top: 48rpx;
font-size: 24rpx;
box-sizing: border-box;
.priceImg {
width: 40rpx;
height: 40rpx;
margin-right: 8rpx;
}
}
.menuView {
width: calc(100vw - 40rpx);
background-color: #fff;
margin: auto;
margin-top: 20rpx;
display: flex;
border-radius: 16rpx;
.menuItem {
flex: 1;
text-align: center;
padding: 32rpx 0rpx;
border-radius: 16rpx;
.menuImg {
width: 96rpx;
height: 96rpx;
}
.menuTitle {
margin-top: 14rpx;
font-size: 24rpx;
}
}
}
.navView {
width: calc(100vw - 40rpx);
background-color: #fff;
margin: auto;
margin-top:46rpx;
border-radius: 16rpx;
margin-bottom: 26rpx;
.navItem {
display: flex;
align-items: center;
justify-content: space-between;
padding: 36rpx 0rpx;
border-bottom: 0.001px solid rgb(173 173 173 / 10%);
width: calc(100% - 40rpx);
margin: auto;
.navTitle {
font-size: 24rpx;
}
.navArrow {
width: 11rpx;
height: 18rpx;
}
}
}
/* 可拖动联系客服组件无需额外样式 */
.arrowImg {
width: 11rpx;
height: 18rpx;
margin-left: 8rpx;
}
.place-view {
height: 200rpx;
}
.mine-info {
padding: 32rpx 40rpx;
box-sizing: border-box;
background: #ffecf3;
display: flex;
position: relative;
.mine-avator {
width: 92rpx;
height: 92rpx;
border-radius: 140rpx;
background: rgba(0, 0, 0, 0.2);
}
.mine-name {
color: #272427;
flex: 1;
margin: 0 24rpx;
.name-editor {
display: flex;
align-items: center;
.name {
font-family: PingFangSC;
font-size: 36rpx;
font-weight: 500;
line-height: 36rpx;
letter-spacing: normal;
color: #272427;
}
.mine-edit {
width: 32rpx;
height: 32rpx;
margin-left: 8rpx;
}
}
.mine-phone {
margin-top: 16rpx;
// width: 110rpx;
// height: 32rpx;
/* 自动布局 */
display: flex;
align-items: center;
padding: 4rpx 8rpx;
.diamond {
width: 120rpx;
height: 32rpx;
}
// gap: 4rpx;
// z-index: 1;
// border-radius: 100rpx 100rpx 100rpx 0;
// background: #4A4A4A;
// .diamond {
// width: 24rpx;
// height: 24rpx;
// }
// .member {
// font-family: PingFang SC;
// font-size: 22rpx;
// color: #f7e8ca;
// }
}
.points {
display: flex;
align-items: center;
margin-top: 16rpx;
.growth {
font-family: PingFangSC;
font-size: 20rpx;
color: #3d3d3d;
}
.growthval {
font-family: PingFangSC;
font-size: 20rpx;
color: #3d3d3d;
margin-left: 4rpx;
}
.progress-bar {
margin-left: 4rpx;
width: 210rpx;
height: 12rpx;
background: #fff;
border-radius: 10rpx;
overflow: hidden;
}
.progress {
height: 100%;
background: #FF19A0;
/* 进度条的颜色 */
transition: width 0.5s ease;
/* 平滑过渡效果 */
}
}
}
.qrcode {
position: absolute;
right: 30rpx;
top: 55rpx;
width: 48rpx;
height: 48rpx;
}
}
.card-holder {
display: flex;
justify-content: space-around;
gap: 70rpx;
padding: 20rpx 30rpx;
// padding: 10rpx 0 30rpx 0;
background: #ffecf3;
.card-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.recharge1 {
display: flex;
align-items: center;
.k {
font-family: PingFangSC;
font-size: 28rpx;
color: #6c6c6c;
margin-top: 10rpx;
}
.balance {
margin-top: 10rpx;
border: 1px solid #FF19A0;
width: 24px;
height: 11px;
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
.k {
font-family: PingFangSC;
font-size: 9px;
color: #FF19A0;
margin-bottom: 10rpx;
}
}
}
.n {
font-family: PingFang SC;
font-size: 36rpx;
color: #272427;
}
.k {
font-family: PingFangSC;
font-size: 28rpx;
color: #6c6c6c;
margin-top: 10rpx;
}
}
}
.mine-slide {
flex: 1;
//
box-sizing: border-box;
background: #ffecf3;
.recharge-slide {
// display: flex;
// overflow-x: auto;
// white-space: nowrap;
.scroll {
display: flex;
.card-roll {
position: relative;
margin-bottom: -10rpx;
.file-pet {
width: 750rpx;
height: 192rpx;
}
.card {
font-family: PingFangSC;
font-size: 40rpx;
color: #ffffff;
}
.amount {
position: absolute;
left: 56rpx;
top: 78rpx;
.surplus {
font-family: PingFangSC;
font-size: 60rpx;
font-weight: 500;
line-height: 64rpx;
letter-spacing: normal;
color: #ffffff;
}
}
.effectiveTime {
display: flex;
margin-top: 16rpx;
.surplus {
font-family: PingFang SC;
font-size: 24rpx;
font-weight: normal;
line-height: 24rpx;
letter-spacing: normal;
color: #ffffff;
}
.first {
font-family: PingFang SC;
font-size: 24rpx;
font-weight: normal;
line-height: 24rpx;
letter-spacing: normal;
color: #ffffff;
}
}
.recharge {
position: absolute;
right: 52rpx;
top: 64rpx;
width: 90rpx;
// border: 1px solid #000;
height: 41rpx;
display: flex;
flex-direction: column;
padding: 16rpx 24rpx;
gap: 20rpx;
border-radius: 179px;
.immediately {
font-family: PingFangSC;
font-size: 28rpx;
font-weight: normal;
line-height: 24rpx;
letter-spacing: normal;
color: #3a3d55;
}
}
.discount {
position: absolute;
right: 0;
top: 0;
width: 50rpx;
height: 20rpx;
/* 自动布局 */
display: flex;
align-items: center;
padding: 8rpx 24rpx;
gap: 4rpx;
border-radius: 0 24rpx 0 24rpx;
background: linear-gradient(270deg, #ff3c4a 0%, #f4c24e 107%);
.break {
font-family: PingFangSC;
font-size: 20rpx;
font-weight: 500;
letter-spacing: normal;
color: #ffffff;
}
}
.use-record {
position: absolute;
right: 51rpx;
top: 19rpx;
display: flex;
align-items: center;
// border: 1px solid #000;
width: 142rpx;
height: 46rpx;
.record {
font-family: PingFang SC;
font-size: 24rpx;
font-weight: normal;
line-height: 24rpx;
display: flex;
align-items: center;
letter-spacing: normal;
color: #ffffff;
margin-right: 10rpx;
}
.s {
width: 11rpx;
height: 18rpx;
}
}
}
}
}
}
.membership {
width: 94%;
margin: 0 auto;
// background: #000;
.swiper {
height: 159rpx;
}
image {
width: 100%;
// height: 219rpx;
}
}
.meber-m {
width: 94%;
margin: 0 auto;
.meb-im {
width: 100%;
height: 200rpx;
border-radius: 15rpx;
}
}
.mine-content {
flex: 1;
padding: 0 24rpx 24rpx;
box-sizing: border-box;
.mine-coupon {
background: #fff;
border-radius: 30rpx;
padding: 26rpx;
margin-top: 32rpx;
flex: 1;
&.service-coupon {
margin-right: 22rpx;
}
.coupon-icon {
width: calc(345 / 339 * 88rpx);
height: 88rpx;
margin-right: 20rpx;
}
}
.mine-file {
background: $app_color_main;
border-radius: 30rpx;
padding: 38rpx 40rpx 34rpx 40rpx;
margin: 0 0 48rpx;
.file-pet {
height: 124rpx;
margin-right: 20rpx;
}
.file-add {
width: 120rpx;
height: 120rpx;
}
.pet-add-info {
flex: 1;
.pet-add-tip {
margin-bottom: 16rpx;
}
}
}
.mine-order {
background: #fff;
border-radius: 0 0 30rpx 30rpx;
padding: 40rpx 27rpx;
margin: 0 0 32rpx 0;
display: flex;
justify-content: space-between;
// padding-right: 10rpx;
// gap: 20rpx;
.flex-center2 {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-left: 100rpx;
}
.flex-center3 {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-left: 90rpx;
}
.flex-center4 {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-left: 106rpx;
}
.order-icon {
width: 52rpx;
height: 52rpx;
margin-bottom: 16rpx;
}
}
.mine-order2 {
background: #fff;
// border-radius: 30rpx;
padding: 40rpx 32rpx;
border-top-left-radius: 20px;
border-top-right-radius: 20px;
// margin: 0 0 32rpx 0;
.flex-center1 {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-left: 10rpx;
}
.order-icon {
width: 52rpx;
height: 52rpx;
margin-bottom: 16rpx;
}
}
.mine-order3 {
background: #fff;
// border-radius: 30rpx;
padding: 40rpx 28rpx;
// border-bottom-left-radius: 20px;
// border-bottom-right-radius: 20px;
.flex-center1 {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-right: 10rpx;
}
.flex-center2 {
// margin-right: -3rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
// .flex-center3{
// // margin-right: 18rpx;
// display: flex;
// flex-direction: column;
// justify-content: center;
// align-items: center;
// }
// margin: 0 0 32rpx 0;
.order-icon {
width: 52rpx;
height: 52rpx;
margin-bottom: 16rpx;
}
}
}
.place-view {
height: 200rpx;
}
.mine-cell-wrapper {
border-radius: 30rpx;
overflow: hidden;
width: 690rpx;
// padding: 40rpx 44rpx;
// margin: 20rpx 0 32rpx 0;
height: 312rpx;
background: #fff;
border-radius: 24rpx;
// &.logout {
// margin-top: 40rpx;
// }
}
::v-deep {
.cell-content {
color: #272427;
// font-weight: bold;
font-family: ali-puhui-bold, "Arial", sans-serif;
font-size: 30rpx !important;
}
}
}
</style>