feat:vip续费

This commit is contained in:
dzc committed 2025-12-15 15:52:56 +08:00
1 parent 00a7a4815a
commit 2615650564
3 files changed
+207 -258

No files matched your search

+2 -2
View File
@@ -145,7 +145,7 @@
<wd-message-box selector="operateMessage" />
<wd-popup custom-class="custom-wechat-popup" :z-index="999" v-model="visibleWechat">
<view class="w-full overflow-hidden p-y-50rpx bg-#f9c26f">
<view class="min-w-70vw w-full overflow-hidden p-y-50rpx bg-#f9c26f">
<view v-if="!userDetail?.userOperationStatus?.isLookWechat" class="flex-col justify-center items-center">
<image class="size-150rpx bg-#333 rounded-full mr-1" :src="userDetail.member?.memberAvatar"
mode="aspectFill" />
@@ -479,7 +479,7 @@ onUnload(() => {
});
</script>
<style lang="scss">
<style>
.custom-wechat-popup {
width: 70% !important;
padding: 0 !important;
+93 -106
View File
@@ -14,13 +14,8 @@
</template>
</wd-navbar>
<swiper
:current="current"
style="height: calc(100vh - 44rpx - 100rpx)"
@change="(e) => (current = e.detail.current)"
:duration="200"
disable-touch
>
<swiper :current="current" style="height: calc(100vh - 44rpx - 100rpx)"
@change="(e) => (current = e.detail.current)" :duration="200" disable-touch>
<swiper-item v-for="(item, index) in segmentedItems" :key="index">
<scroll-user :scene="item['search-action']" />
</swiper-item>
@@ -28,30 +23,22 @@
</wd-config-provider>
<navigator url="/pages/wechat-tabbar/index" open-type="navigate" hover-class="navigator-hover">
<image
class="size-100rpx fixed right-0 bottom-260"
src="@/static/invitation-activity.png"
mode="scaleToFill"
/>
<image class="size-100rpx fixed right-0 bottom-260" src="@/static/invitation-activity.png" mode="scaleToFill" />
</navigator>
<!-- #ifdef H5 -->
<view
v-if="!isOpenGPS"
<view v-if="!isOpenGPS"
class="w-full h-100rpx bg-color-theme-dark fixed bottom-100 left-0 right-0 c-#222 flex items-center px-2"
@click="openSystemGPS"
>
@click="openSystemGPS">
<uni-icons type="location-filled" color="black" size="24" />
<text>点击开启位置权限,匹配您附近的那个Ta~</text>
</view>
<!-- #endif -->
<!-- #ifndef H5 -->
<view
v-if="!isOpenGPS"
<view v-if="!isOpenGPS"
class="w-full h-100rpx bg-color-theme-dark fixed bottom-0 left-0 right-0 c-#222 flex items-center px-2"
@click="openSystemGPS"
>
@click="openSystemGPS">
<uni-icons type="location-filled" color="black" size="24" />
<text>点击开启位置权限,匹配您附近的那个Ta~</text>
</view>
@@ -61,99 +48,99 @@
</template>
<script setup lang="ts">
import { computed, ref } from 'vue';
import segmented from '@/sheep/components/segmented/segmented.vue';
import RecentApi from '@/sheep/api/member/recent';
import ScrollUser from './components/scroll-user.vue';
// @ts-ignore
import sheep from '@/sheep';
import { onLoad, onShow } from '@dcloudio/uni-app';
import { computed, ref } from 'vue';
import segmented from '@/sheep/components/segmented/segmented.vue';
import RecentApi from '@/sheep/api/member/recent';
import ScrollUser from './components/scroll-user.vue';
// @ts-ignore
import sheep from '@/sheep';
import { onLoad, onShow } from '@dcloudio/uni-app';
const current = ref(0);
const segmentedItems = ref([]);
const isOpenGPS = ref(true);
const userCity = computed(() => sheep.$store('user').userCity);
const current = ref(0);
const segmentedItems = ref([]);
const isOpenGPS = ref(true);
const userCity = computed(() => sheep.$store('user').userCity);
onLoad(async () => {
// 获取顶部导航栏tab菜单
const { data } = await RecentApi.getSquareTabMenu();
if (data && data.length > 0) {
segmentedItems.value = data;
}
getLocation();
onLoad(async () => {
// 获取顶部导航栏tab菜单
const { data } = await RecentApi.getSquareTabMenu();
if (data && data.length > 0) {
segmentedItems.value = data;
}
getLocation();
});
onShow(() => {
getLocation();
});
const getLocation = () => {
uni.getLocation({
geocode: true,
success: (res) => {
const params = {
lat: String(res.latitude),
lon: String(res.longitude),
province: res.address?.province ?? '',
city: res.address?.city ?? '',
district: res.address?.district ?? '',
address: res.address?.street ?? '',
};
RecentApi.updateUserLocation(params);
isOpenGPS.value = true;
},
fail: (err) => {
isOpenGPS.value = false;
},
});
};
onShow(() => {
getLocation();
});
const getLocation = () => {
uni.getLocation({
geocode: true,
success: (res) => {
const params = {
lat: String(res.latitude),
lon: String(res.longitude),
province: res.address?.province ?? '',
city: res.address?.city ?? '',
district: res.address?.district ?? '',
address: res.address?.street ?? '',
};
RecentApi.updateUserLocation(params);
isOpenGPS.value = true;
},
fail: (err) => {
isOpenGPS.value = false;
},
});
};
const openSystemGPS = () => {
// #ifdef APP-PLUS || MP-WEIXIN
const system = uni.getSystemInfoSync();
if (system.platform === 'android') {
// 安卓手机授权之后还需打开定位服务功能GPS
const context: any = plus.android.importClass('android.content.Context');
const locationManager: any = plus.android.importClass('android.location.LocationManager');
const main: any = plus.android.runtimeMainActivity();
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
const openSystemGPS = () => {
// #ifdef APP-PLUS || MP-WEIXIN
const system = uni.getSystemInfoSync();
if (system.platform === 'android') {
// 安卓手机授权之后还需打开定位服务功能GPS
const context: any = plus.android.importClass('android.content.Context');
const locationManager: any = plus.android.importClass('android.location.LocationManager');
const main: any = plus.android.runtimeMainActivity();
const mainSvr = main.getSystemService(context.LOCATION_SERVICE);
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
const Intent: any = plus.android.importClass('android.content.Intent');
const Settings: any = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
}
const Intent: any = plus.android.importClass('android.content.Intent');
const Settings: any = plus.android.importClass('android.provider.Settings');
const intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
main.startActivity(intent); // 打开系统设置GPS服务页面
}
} else if (system.platform == 'ios') {
// ios打开对应的通知栏
uni.showModal({
title: '定位权限开启提醒',
content: '未开启定位,请前往设置!',
confirmText: '去设置',
success: function (res) {
if (res.confirm) {
const app = plus.ios.invoke('UIApplication', 'sharedApplication');
const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
plus.ios.invoke(app, 'openURL:', setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
}
},
});
}
// #endif
// #ifdef H5
uni.showToast({ title: '不支持', icon: 'none' });
// #endif
};
const goSelectAddress = () => {
uni.navigateTo({
url: '/pages/home/city',
events: {
changeCity: async () => {},
} else if (system.platform == 'ios') {
// ios打开对应的通知栏
uni.showModal({
title: '定位权限开启提醒',
content: '未开启定位,请前往设置!',
confirmText: '去设置',
success: function (res) {
if (res.confirm) {
const app = plus.ios.invoke('UIApplication', 'sharedApplication');
const setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:');
plus.ios.invoke(app, 'openURL:', setting);
plus.ios.deleteObject(setting);
plus.ios.deleteObject(app);
}
},
});
};
}
// #endif
// #ifdef H5
uni.showToast({ title: '不支持', icon: 'none' });
// #endif
};
const goSelectAddress = () => {
uni.navigateTo({
url: '/pages/home/city',
events: {
changeCity: async () => { },
},
});
};
</script>
+112 -150
View File
@@ -15,11 +15,8 @@
<scroll-view class="h-[calc(100vh-144rpx)]" scroll-y>
<!-- 个人信息 -->
<view class="flex items-center p-6">
<image
:src="userInfo.avatar"
class="mr-4 size-100px rounded-full bg-#333 border border-amber border-solid"
mode="aspectFill"
/>
<image :src="userInfo.avatar" class="mr-4 size-100px rounded-full bg-#333 border border-amber border-solid"
mode="aspectFill" />
<view class="flex-1">
<view class="mb-1 text-base">
<text>{{ userInfo.nickname }}</text>
@@ -27,18 +24,13 @@
</view>
<view class="mb-2 text-xs text-#ffffff80 flex items-center">
<text>ID: {{ userInfo.id }}</text>
<view
v-if="userInfo.memberVip?.vip"
class="text-20rpx ml-2 flex-row-center bg-color-theme-dark px-1 rounded-1"
>
<view v-if="userInfo.memberVip?.vip"
class="text-20rpx ml-2 flex-row-center bg-color-theme-dark px-1 rounded-1">
<uni-icons type="vip-filled" size="14" />
<text class="text-color-dark ml-1">VIP</text>
</view>
</view>
<text
v-if="userCity?.t"
class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1 truncate"
>
<text v-if="userCity?.t" class="bg-#333 text-color-theme-dark text-xs px-2 py-1 rounded-1 truncate">
{{ userCity?.t || '' }}
</text>
</view>
@@ -59,11 +51,7 @@
<text class="text-color-theme text-sm">喜欢我</text>
</view>
<view class="flex-1">
<navigator
url="/pages/profile/recharge"
open-type="navigate"
hover-class="navigator-hover"
>
<navigator url="/pages/profile/recharge" open-type="navigate" hover-class="navigator-hover">
<view class="flex-col-center">
<text class="text-color-theme font-600 text-lg">
{{ fen2yuanSimple(userWallet.balance) }}
@@ -76,24 +64,20 @@
<!-- 开通vip -->
<view
class="text-color-theme-dark mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#D29E52/60 b-l-#D29E52/40 b-r-#D29E52/40 b-b-#D29E52/20 flex justify-between"
>
class="text-color-theme-dark mx-4 p-4 rounded-2 bg-gradient-to-b from-#111 to-#222 b-4 b-solid b-t-#D29E52/60 b-l-#D29E52/40 b-r-#D29E52/40 b-b-#D29E52/20 flex justify-between">
<view class="font-900 font-italic text-xl">VIP</view>
<view class="flex items-center">
<text class="text-xs">尊享vip免费特权</text>
<navigator
v-if="!userInfo.memberVip?.vip"
url="/pages/profile/apply-vip"
open-type="navigate"
hover-class="navigator-hover"
>
<text class="ml-4 px-4 py-1 rounded-full text-24rpx bg-color-theme text-black">
<text v-if="!userInfo.memberVip?.vip" class="text-xs">尊享vip免费特权</text>
<text v-else>{{ formatDate(userInfo.memberVip.expirationTime, "YYYY-MM-DD") }}</text>
<navigator url="/pages/profile/apply-vip" open-type="navigate" hover-class="navigator-hover">
<text v-if="!userInfo.memberVip?.vip"
class="ml-4 px-4 py-1 rounded-full text-24rpx bg-color-theme text-black">
立即开通
</text>
<text v-else class="ml-4 px-2 py-1 rounded-1 text-24rpx bg-color-theme text-black">
立即续费
</text>
</navigator>
<text v-else class="ml-4 px-2 py-1 rounded-1 text-24rpx bg-color-theme text-black">
VIP 开通成功
</text>
</view>
</view>
@@ -110,11 +94,7 @@
<text class="text-xs ml-2">邀请福利</text>
<text class="text-20rpx ml-4 mt-2rpx">邀请用户领会员</text>
</view>
<navigator
url="/pages/wechat-tabbar/index"
open-type="navigate"
hover-class="navigator-hover"
>
<navigator url="/pages/wechat-tabbar/index" open-type="navigate" hover-class="navigator-hover">
<view class="bg-color-theme text-xs rounded-full py-1 px-3">查看福利</view>
</navigator>
</view>
@@ -123,29 +103,14 @@
<!-- 菜单 -->
<view class="mt-2 mx-1">
<wd-cell-group>
<wd-cell
v-for="(item, index) in MenuCellList"
:key="index"
:title="item.title"
:value="item.value"
icon-size="24"
:icon="item.icon"
is-link
ellipsis
:to="item.to"
@click="item.onClick"
/>
<wd-cell v-for="(item, index) in MenuCellList" :key="index" :title="item.title" :value="item.value"
icon-size="24" :icon="item.icon" is-link ellipsis :to="item.to" @click="item.onClick" />
</wd-cell-group>
</view>
<view class="h-100rpx"></view>
</scroll-view>
<wd-popup
v-model="myEvaluationShow"
custom-style="border-radius:32rpx;"
closable
:safe-area-inset-bottom="true"
>
<wd-popup v-model="myEvaluationShow" custom-style="border-radius:32rpx;" closable :safe-area-inset-bottom="true">
<view class="w-90vw h-400rpx flex-col-center gap-4 flex-wrap">
<view class="text-color-theme text-lg">
<text>我的评价</text>
@@ -176,111 +141,108 @@
</view>
</view>
</wd-popup>
<wd-curtain
v-model="curtainShow"
<wd-curtain v-model="curtainShow"
src="https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png"
close-position="top-right"
:width="300"
close-on-click-modal
show-menu-by-longpress
/>
close-position="top-right" :width="300" close-on-click-modal show-menu-by-longpress />
</wd-config-provider>
</template>
<script setup lang="ts">
import { computed, reactive, ref } from 'vue';
import UserAblum from './components/user-ablum.vue';
import useAblum from '../profile/use-ablum';
// @ts-ignore
import sheep from '@/sheep';
import RecentApi from '@/sheep/api/member/recent';
import { onShow } from '@dcloudio/uni-app';
// @ts-ignore
import { fen2yuanSimple } from '@/sheep/hooks/useGoods';
import { computed, reactive, ref } from 'vue';
import UserAblum from './components/user-ablum.vue';
import useAblum from '../profile/use-ablum';
// @ts-ignore
import sheep from '@/sheep';
import RecentApi from '@/sheep/api/member/recent';
import { onShow } from '@dcloudio/uni-app';
// @ts-ignore
import { formatDate } from '@/sheep/helper/utils';
// @ts-ignore
import { fen2yuanSimple } from '@/sheep/hooks/useGoods';
const { ablumList } = useAblum();
const { ablumList } = useAblum();
// 统计信息
const recentTotal = ref({
memberRecentId: null,
bizType: null,
likeTotal: 0,
likeItTotal: 0,
likeMeTotal: 0,
reportTotal: 0,
shieldTotal: 0,
collectTotal: 0,
userLikeItTotal: 0,
userLikeMeTotal: 0,
// 统计信息
const recentTotal = ref({
memberRecentId: null,
bizType: null,
likeTotal: 0,
likeItTotal: 0,
likeMeTotal: 0,
reportTotal: 0,
shieldTotal: 0,
collectTotal: 0,
userLikeItTotal: 0,
userLikeMeTotal: 0,
});
// 我的评价数据
const myEvaluation = reactive({
scoreSc: 0,
scoreNx: 0,
scoreSk: 0,
scoreYq: 0,
avgScore: 0,
evaluateCount: 0,
});
const myEvaluationShow = ref(false); // 我的评价弹窗
const curtainShow = ref(false); // 关注公众号弹窗
const userInfo = computed(() => sheep.$store('user').userInfo);
const userCity = computed(() => sheep.$store('user').userCity);
const userWallet = computed(() => sheep.$store('user').userWallet);
const userGenderImageSrc = computed(() => {
const sex = userInfo.value.sex;
if (sex === 1) return '/static/gender-man.png';
if (sex === 2) return '/static/gender-woman.png';
return '';
});
onShow(async () => {
const { data: totalData } = await RecentApi.recentTotal();
recentTotal.value = totalData ?? {};
});
// type: 0-我喜欢 1-喜欢我
const goLike = (type: 0 | 1) => {
uni.navigateTo({
url: `/pages/profile/like?type=${type}`,
});
};
// 我的评价数据
const myEvaluation = reactive({
scoreSc: 0,
scoreNx: 0,
scoreSk: 0,
scoreYq: 0,
avgScore: 0,
evaluateCount: 0,
// 查看我的评价
const lookMyEvaluation = async () => {
const { data = null } = await RecentApi.myEvaluate();
if (data) {
Object.assign(myEvaluation, data);
myEvaluationShow.value = true;
return;
}
uni.showToast({ title: '查看失败', icon: 'none' });
};
// 关注公众号
const subOfficial = () => {
curtainShow.value = true;
};
// 问题反馈
const goFeedback = () => {
uni.navigateTo({
url: '/pages/profile/feedback',
});
const myEvaluationShow = ref(false); // 我的评价弹窗
const curtainShow = ref(false); // 关注公众号弹窗
};
const userInfo = computed(() => sheep.$store('user').userInfo);
const userCity = computed(() => sheep.$store('user').userCity);
const userWallet = computed(() => sheep.$store('user').userWallet);
const userGenderImageSrc = computed(() => {
const sex = userInfo.value.sex;
if (sex === 1) return '/static/gender-man.png';
if (sex === 2) return '/static/gender-woman.png';
return '';
});
onShow(async () => {
const { data: totalData } = await RecentApi.recentTotal();
recentTotal.value = totalData ?? {};
});
// type: 0-我喜欢 1-喜欢我
const goLike = (type: 0 | 1) => {
uni.navigateTo({
url: `/pages/profile/like?type=${type}`,
});
};
// 查看我的评价
const lookMyEvaluation = async () => {
const { data = null } = await RecentApi.myEvaluate();
if (data) {
Object.assign(myEvaluation, data);
myEvaluationShow.value = true;
return;
}
uni.showToast({ title: '查看失败', icon: 'none' });
};
// 关注公众号
const subOfficial = () => {
curtainShow.value = true;
};
// 问题反馈
const goFeedback = () => {
uni.navigateTo({
url: '/pages/profile/feedback',
});
};
// 菜单
const MenuCellList = [
{ title: '我的收益', value: '', icon: 'wallet', to: '/pages/wechat-tabbar/index' },
{ title: '访客记录', value: '', icon: 'browse', to: '/pages/profile/view-record' },
{ title: '认证中心', value: '', icon: 'user', to: '/pages/profile/verify-status' },
{ title: '我的动态', value: '', icon: 'star', to: '/pages/profile/my-moment' },
{ title: '我的评价', value: '', icon: 'view-module', to: '', onClick: lookMyEvaluation },
{ title: '问题反馈', value: '', icon: 'backtop-rectangle', to: '', onClick: goFeedback },
// { title: '客服助手', value: '', icon: 'service', to: '' },
{ title: '关注公众号', value: '获取最新消息', icon: 'qrcode', to: '', onClick: subOfficial },
{ title: '设置', value: '', icon: 'setting1', to: '/pages/profile/setting' },
];
// 菜单
const MenuCellList = [
{ title: '我的收益', value: '', icon: 'wallet', to: '/pages/wechat-tabbar/index' },
{ title: '访客记录', value: '', icon: 'browse', to: '/pages/profile/view-record' },
{ title: '认证中心', value: '', icon: 'user', to: '/pages/profile/verify-status' },
{ title: '我的动态', value: '', icon: 'star', to: '/pages/profile/my-moment' },
{ title: '我的评价', value: '', icon: 'view-module', to: '', onClick: lookMyEvaluation },
{ title: '问题反馈', value: '', icon: 'backtop-rectangle', to: '', onClick: goFeedback },
// { title: '客服助手', value: '', icon: 'service', to: '' },
// { title: '关注公众号', value: '获取最新消息', icon: 'qrcode', to: '', onClick: subOfficial },
{ title: '设置', value: '', icon: 'setting1', to: '/pages/profile/setting' },
];
</script>