HaniBlindBox/honey_box/pages/user/index.vue
2026-02-08 01:02:07 +08:00

784 lines
18 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">
<uni-nav-bar left-text=" " color="#fff" backgroundColor="transparent" :border="false" :statusBar="true"
:fixed="false"></uni-nav-bar>
<view class="user-card">
<view class="user-info" @click="toChange">
<view class="avatar">
<image v-if="userinfo.headimg" :src="userinfo.headimg" mode="scaleToFill" />
</view>
<view class="info">
<view v-if="userinfo.nickname" class="nick hang1">
{{ userinfo.nickname }}
</view>
<view v-else class="nick">未登录</view>
<view v-if="userinfo" class="user-day">
已经陪你走过了{{ userinfo.day }}天
</view>
</view>
</view>
<view v-if="userinfo && getIsCheck()" class="lv-box align-center justify-between"
@click="$c.to({ url: '/package/mine/equity' })">
<text class="lv-box-dengji">LV.{{ userinfo.quanYiLevel.level }}</text>
<view class="lv-box-ouqi column">
<text>
<template v-if="userinfo.quanYiLevel.cha > 0">还差{{ userinfo.quanYiLevel.cha
}}欧气值升级</template>
<template v-if="userinfo.quanYiLevel.cha == -1">已满级</template>
</text>
<view class="mt10 relative">
<!-- <text class="lv-box-num">{{userinfo.quanYiLevel.jindu+'%'}}</text> -->
<cmd-progress :percent="userinfo.quanYiLevel.jindu" :show-info="false" stroke-color="#FF862D"
:strokeWidth="3"></cmd-progress>
</view>
</view>
<text class="lv-box-detail center" @click="$c.to({ url: '/package/mine/equity' })">查看详情</text>
<image style="width: 206rpx; height: 206rpx; position: absolute; top: -40rpx; right: 8rpx;"
:src="$img1('my/ou.png')">
</image>
</view>
<!-- <view class="rbtn btn1 flex" @click="$c.to({ url: '/package/index/sign' })">
<image class="img100" :src="$img1('my/sign.png')"></image>
</view> -->
</view>
<view v-if="getIsCheck('user_money')" class="money-card">
<view class="other-num">
<view class="other-item" @click="toFinancePage('/pages/user/bi_jl')">
<view class="item-content">
<view class="title">{{ $config.getAppSetting('currency1_name') }}</view>
<view class="num">{{ formatNumber(userinfo.integral) }}</view>
</view>
</view>
<view class="divider"></view>
<view class="other-item" @click="toFinancePage('/pages/user/jf_jl')">
<view class="item-content">
<view class="title">{{ $config.getAppSetting('currency2_name') }}</view>
<view class="num">{{ formatNumber(userinfo.money2) }}</view>
</view>
</view>
<view v-if="zuanshi" class="divider"></view>
<view v-if="zuanshi" class="other-item" @click="toFinancePage('/pages/user/yetx')">
<view class="item-content">
<view class="title-wrapper">
<view class="title">{{ $config.getAppSetting('balance_name') }}</view>
<view class="recharge-tag" @click.stop="toFinancePage('/pages/user/recharge-page')">充值
</view>
</view>
<view class="num">{{ formatNumber(userinfo.money) }}</view>
</view>
</view>
</view>
</view>
<view v-if="taskList.length > 0 && getIsCheck('user_task')" class="task">
<view class="task-title">主要任务</view>
<view
style="width: 622rpx; height: 2rpx; background-color: #F3F3F3; margin-left: 32rpx; margin-top: 34rpx;">
</view>
<view class="task-list">
<view class="task-item" v-for="(item, i) in taskList" :key="i">
<view class="task-l">
<view class="title">{{ item.title }} ({{ item.ywc_count }}/{{ item.number }})</view>
<view class="num">欧气值+{{ item.z_number }}</view>
</view>
<view class="task-r">
<view v-if="item.is_complete == 0" class="btn" @click="toPage(item.id)">
<text>去完成</text>
</view>
<view v-if="item.is_complete == 1" class="btn act" @click="completeTask(item)">
<text>待领取</text>
</view>
<view v-if="item.is_complete == 2" class="btn dis">
<text>已领取</text>
</view>
</view>
</view>
</view>
</view>
<view class="qita mt30">
<view class="qita-title" v-if="getIsCheck('user_menu_title')">其他服务</view>
<view class="menu-card">
<template v-for="(item, i) in menuList">
<!-- 普通菜单项 -->
<view v-if="item.show && !item.isCustomService" class="menu-item-wrapper" :key="i">
<view class="menu-item" @click="handleMenuClick(item)">
<view class="icon">
<image :src="$img1(item.icon)" mode=""></image>
</view>
<view class="title">
{{ item.title }}
</view>
<view class="arrow">
<uni-icons type="right" size="16" color="#CCCCCC"></uni-icons>
</view>
</view>
<view v-if="i < menuList.filter(m => m.show).length - 1" class="divider-line"></view>
</view>
<!-- 微信小程序客服菜单项 -->
<view v-if="item.show && item.isCustomService" class="menu-item-wrapper relative"
:key="`service-${i}`">
<view class="menu-item">
<view class="icon">
<image :src="$img1(item.icon)" mode=""></image>
</view>
<view class="title">
{{ item.title }}
</view>
<view class="arrow">
<uni-icons type="right" size="16" color="#CCCCCC"></uni-icons>
</view>
</view>
<button class="hide" open-type="contact"></button>
<view v-if="i < menuList.filter(m => m.show).length - 1" class="divider-line"></view>
</view>
</template>
</view>
</view>
<!-- 群聊弹窗 -->
<uni-popup ref="qunliao_show" type="center" maskBackgroundColor="rgba(0,0,0,0.8)">
<view class="pop-ball">
<image show-menu-by-longpress
:src="erweimaUrl" mode="aspectFit"
style="width:80vw;height:468px;position:relative;top:-14%;left:0;">
</image>
</view>
<view class="pop-ball-close flex" @click="$refs.qunliao_show.close()">
<view style="width: 48rpx;height: 48rpx;border-radius: 50%;opacity: 0.5;">
<image show-menu-by-longpress :src="$img1('common/close.png')" class="img100" />
</view>
</view>
</uni-popup>
</view>
</template>
<script>
import { getUser } from '@/common/server/user.js';
import { receiveCoupon } from '@/common/server/coupon.js';
import { receiveTaskReward } from '@/common/server/welfare.js';
export default {
components: {},
data() {
return {
z_imgPath: this.$z_img2,
userinfo: '',
menuList: [],
zuanshi: true,
show: 1,
taskList: []
}
},
computed: {
// 获取显示的菜单列表
visibleMenuList() {
return this.menuList.filter(item => item.show);
},
// 福利群二维码图片URL
erweimaUrl() {
return this.$config.getBaseConfigKey('erweima') || 'https://image.zfunbox.cn/topic/20250418/0b40de65d2fc4801517569193bfd4cac.png';
}
},
onLoad(e) {
if (e.ou_coupon_id) {
uni.setStorageSync('_ou_coupon_id', e.ou_coupon_id)
}
if (e.pid) {
uni.setStorageSync('pid', e.pid)
}
console.log(this.$platform.code);
},
onHide() {
// uni.setStorageSync('page', this.$mp.page.route)
},
onShareAppMessage() {
let imageUrl = this.$config.getShareImageUrl();
// 使用小写 id兼容新版 .NET API
const userinfo = uni.getStorageSync('userinfo') || {};
const pid = userinfo.id || userinfo.ID || '';
return {
imageUrl: imageUrl,
title: this.$config.getAppSetting('share_title_detail') || "哈尼盲盒,正版潮玩手办一番赏",
path: '/pages/user/index?pid=' + pid
}
},
onShow() {
this.getdata()
// 获取平台菜单列表
this.menuList = this.$platform.getUserMenuList();
// this.zuanshi = this.$platform.code != "MP-WEIXIN";
const curPages = getCurrentPages()[0]; // 获取当前页面实例
// #ifdef MP
if (typeof curPages.getTabBar === 'function' && curPages.getTabBar()) {
this.$mp.page.getTabBar().setData({
selected: 4
});
}
// #endif
},
methods: {
toChange() {
var user = uni.getStorageSync('userinfo');
if (user == null || user == "" || this.userinfo == '') {
uni.setStorageSync('redirect', '/pages/user/index');
this.$c.nav("/pages/user/login")
return;
}
this.$c.to({
url: '/pages/user/change'
})
},
getIsCheck(tag) {
return !this.$platform.getIsCheck(tag);
},
async receiveCoupon() {
const coupon_id = uni.getStorageSync('_ou_coupon_id')
const res = await receiveCoupon(coupon_id);
uni.removeStorageSync('_ou_coupon_id')
if (res.status == 1) {
this.$c.toast({
title: res.msg,
duration: 500,
success: () => {
this.$c.to({
url: '/package/mine/coupon-detail',
query: {
id: coupon_id
}
})
}
})
} else if (res.status == 2222) {
this.$c.to({
url: '/package/mine/coupon-detail',
query: {
id: coupon_id
}
})
}
},
async completeTask(item) {
const res = await receiveTaskReward(item.id);
if (res.status == 1) {
this.$c.toast({
title: res.msg,
duration: 500,
success: () => {
this.getdata()
}
})
}
},
/**
* 处理菜单项点击
* @param {Object} item 菜单项
*/
handleMenuClick(item) {
if (item.handler) {
item.handler(item, this);
}
},
copy(e) {
uni.setClipboardData({
data: `${e}`,
success: result => {},
fail: error => {}
})
},
getlist(index) {
this.show = index
},
todetail(a) {
if (a.type == 2) {
this.$customRouter.navigateTo('/pages/shouye/detail_wuxian', {
goods_id: a.goods_id
});
} else {
this.$customRouter.navigateTo('/pages/shouye/detail', {
goods_id: a.goods_id,
goods_num: a.num
});
}
},
async getdata() {
if (uni.getStorageSync('token') == null || uni.getStorageSync('token') == "") {
this.userinfo = '';
this.taskList = [];
return;
}
const res = await getUser();
console.log("=== getUser API响应 ===");
console.log("完整响应:", JSON.stringify(res));
console.log("res.data:", JSON.stringify(res.data));
console.log("res.data.userinfo:", JSON.stringify(res.data?.userinfo));
console.log("money字段:", res.data?.userinfo?.money);
console.log("money2字段:", res.data?.userinfo?.money2);
console.log("integral字段:", res.data?.userinfo?.integral);
if (res.status == 1) {
this.userinfo = res.data.userinfo
this.taskList = res.data.taskList || []
console.log("=== 赋值后 this.userinfo ===");
console.log("this.userinfo:", JSON.stringify(this.userinfo));
console.log("this.userinfo.money:", this.userinfo?.money);
uni.setStorageSync('userinfo', this.userinfo)
uni.setStorageSync('corpid', res.data.other?.corpid)
}
},
//跳转页面
toPage(id) {
if (id == 1) {
this.$c.to({
url: '/pages/user/tui-guang'
})
} else {
this.$c.to({
type: 3,
url: '/pages/shouye/index'
})
}
},
/**
* 跳转到财务相关页面(需要登录)
* @param {String} url - 页面路径
*/
toFinancePage(url) {
const token = uni.getStorageSync('token');
if (!token) {
uni.setStorageSync('redirect', '/pages/user/index');
uni.showToast({
title: '请先登录',
icon: 'none'
});
setTimeout(() => {
this.$c.nav('/pages/user/login');
}, 100);
return;
}
this.$c.to({ url });
},
/**
* 格式化数字,如果小数部分是.00则只显示整数部分
* @param {Number|String} num - 要格式化的数字
* @param {String} defaultVal - 默认值当num为空时返回
* @return {String} - 格式化后的数字字符串
*/
formatNumber(num, defaultVal = '0') {
if (num === undefined || num === null || num === '' || num === 0) {
return defaultVal;
}
const numStr = num.toString();
if (numStr.endsWith('.00')) {
return parseFloat(num).toFixed(0);
}
return numStr;
}
}
}
</script>
<style lang="scss">
.mine {
// width: 750rpx;
width: 100vw;
min-height: 100vh;
&::before {
content: "";
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
background-image: url('/static/main_bg.jpg');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.user-card {
position: relative;
padding: 20rpx 30rpx;
.user-info {
display: flex;
align-items: center;
.avatar {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
overflow: hidden;
background: #D8D8D8;
image {
width: 100%;
height: 100%;
}
}
.info {
width: calc(100% - 100rpx);
box-sizing: border-box;
padding-left: 30rpx;
.nick {
max-width: 200rpx;
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.user-day {
margin-top: 10rpx;
font-size: 24rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #8A8A8A;
}
}
}
.lv-box {
height: 216rpx;
margin-top: 80rpx;
box-sizing: border-box;
position: relative;
background: url($imgurl+'my/userVip.png') no-repeat 0 0 / 100% 100%;
padding-left: 136rpx;
&-dengji {
position: absolute;
left: 32rpx;
top: 16rpx;
font-weight: 500;
font-size: 48rpx;
color: #333333;
width: 100rpx;
}
&-ouqi {
position: absolute;
bottom: 24rpx;
left: 32rpx;
>text {
font-weight: 400;
font-size: 16rpx;
color: #4C4C4C;
}
>view {
width: 618rpx;
height: 6rpx;
border-radius: 6rpx;
::v-deep.cmd-progress-inner {
background: #CCCCCC;
}
}
}
&-detail {
width: 96rpx;
height: 36rpx;
position: absolute;
left: 34rpx;
top: 86rpx;
font-weight: 400;
font-size: 16rpx;
color: #4C4C4C;
border-radius: 6rpx;
background-color: #E6F791;
}
}
}
.money-card {
width: 690rpx;
margin: 20rpx auto 0;
.other-num {
display: flex;
flex-direction: row;
align-items: center;
background-color: #FFFFFF;
border-radius: 16rpx;
padding: 30rpx 0;
.other-item {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
.item-content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.title-wrapper {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 16rpx;
width: 100%;
.title {
font-size: 24rpx;
font-weight: 400;
color: #333333;
margin: 0;
}
.recharge-tag {
margin-left: 10rpx;
padding: 4rpx 12rpx;
background-color: #E6F791;
border-radius: 6rpx;
font-size: 20rpx;
font-weight: 400;
color: #333333;
flex-shrink: 0;
}
}
.title {
font-size: 24rpx;
font-weight: 400;
color: #333333;
margin-bottom: 16rpx;
}
.num {
font-size: 28rpx;
font-weight: 400;
color: #333333;
}
}
}
.divider {
width: 1rpx;
height: 60rpx;
background-color: #F3F3F3;
}
}
}
.task {
margin: 30rpx auto 0;
width: 690rpx;
box-sizing: border-box;
padding: 0 0 20rpx;
background-color: #FFFFFF;
border-radius: 16rpx;
.task-title {
position: relative;
z-index: 1;
margin-left: 32rpx;
padding-top: 34rpx;
margin-bottom: 30rpx;
font-size: 28rpx;
font-weight: 400;
color: #333333;
}
.task-list {
border-radius: 20rpx;
padding: 30rpx;
}
.task-item {
padding: 20rpx 0;
display: flex;
justify-content: space-between;
align-items: center;
.task-l {
.title {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.num {
margin: 20rpx 0;
font-size: 26rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #8A8A8A;
}
}
.task-r {
flex: 1;
display: flex;
justify-content: flex-end;
padding-left: 30rpx;
.btn {
width: 142rpx;
height: 60.35rpx;
border-radius: 16rpx;
display: flex;
justify-content: center;
align-items: center;
background-color: #FFED94;
text {
font-weight: 600;
font-size: 24rpx;
color: #333333;
}
&.act {
background: #333333;
text {
font-size: 24rpx;
color: #FFED94;
}
}
&.dis {
background: #F5F5F5;
border-radius: 16rpx;
text {
color: #999999;
}
}
}
}
}
}
.qita {
margin: 30rpx auto 0;
width: 690rpx;
background-color: #FFFFFF;
border-radius: 16rpx;
&-title {
font-weight: 500;
font-size: 28rpx;
color: #333333;
padding-top: 36rpx;
padding-left: 32rpx;
padding-bottom: 20rpx;
}
.menu-card {
padding: 0 32rpx 20rpx;
display: flex;
flex-direction: column;
.menu-item-wrapper {
position: relative;
.menu-item {
display: flex;
flex-direction: row;
align-items: center;
padding: 24rpx 0;
width: 100%;
.icon {
width: 48rpx;
height: 48rpx;
margin-right: 24rpx;
flex-shrink: 0;
image {
width: 100%;
height: 100%;
}
}
.title {
flex: 1;
font-size: 28rpx;
font-weight: 400;
color: #333333;
margin: 0;
}
.arrow {
flex-shrink: 0;
margin-left: 20rpx;
}
}
.divider-line {
height: 1rpx;
background-color: #E0E0E0;
margin: 0;
}
}
}
}
}
.pop-ball {
width: 85vw;
position: relative;
border-radius: 25rpx;
display: flex;
align-items: center;
justify-content: center;
}
.pop-ball-close {
margin-top: 20rpx;
width: 100%;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
}
</style>