Files
yunxinwei-uniapp/pages/user/user.vue
2024-01-10 13:45:57 +08:00

770 lines
17 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>
<view class="main-header">
<image class="bg-image" :src="bgImage" mode="scaleToFill"></image>
<image src="@/static/star1.svg" class="star star1" mode="widthFix"></image>
<image src="@/static/star1.svg" class="star star2" mode="widthFix"></image>
<image src="@/static/star1.svg" class="star star3" mode="widthFix"></image>
<!-- 用户信息 -->
<view class="user-info" @click="onLogin">
<u-avatar :src="userInfo.avatar" :size="120" img-mode="aspectFill" show-level></u-avatar>
<view class="user-content">
<view class="nick-name">{{ userInfo.nickname }}</view>
<view class="login-tips" v-for="(item,index) in userInfo.roles" :key="index">
<u-tag :text="userInfo.mobile ? userInfo.mobile : item.roleName" plain size="mini" type="info"></u-tag>
<!-- <u-tag v-if="userInfo.phone" :text="userInfo.mobile" plain size="mini" type="info"></u-tag> -->
</view>
</view>
</view>
</view>
<!-- 绑定手机号 -->
<view class="my-mobile" v-if="userInfo.userId && !userInfo.phone">
<view class="info">点击绑定手机号确保账户安全</view>
<button class="btn-bind" open-type="getAuthorize" size="mini" scope="phoneNumber" @click="bindPhone">去绑定</button>
</view>
<view class="my-mobile" v-if="userInfo.userId && !userInfo.avatar">
<view class="info">点击获取头像昵称</view>
<button
open-type="getAuthorize"
scope="userInfo"
onGetAuthorize="getOpenUserInfo"
onError="handleAuthError"
size="mini"
class="btn-bind"
v-if="userInfo.username && userInfo.username !== 'www'"
@click="onUpdateAvatar"
>
去获取
</button>
<!-- <button class="btn-bind" open-type="getAuthorize" size="mini" scope="phoneNumber" @click="bindPhone">获取头像昵称</button> -->
</view>
<!-- 我的钱包 -->
<view class="my-asset">
<view class="asset-left flex-box dis-flex flex-x-around">
<view class="asset-left-item">
<view class="item-value dis-flex flex-x-center">
<text>{{ userInfo.userId ? userInfo.balance : '--' }}</text>
</view>
<view class="item-name dis-flex flex-x-center">
<text>可提现</text>
</view>
</view>
<!-- <view class="asset-left-item" style="display: flex;align-items: center;">
<u-button shape="circle" size="mini"
@click="navTo('package/dealer/withdraw/apply')">查看明细</u-button>
</view> -->
<!-- <view class="asset-left-item" style="display: flex;align-items: center;">
<u-button shape="circle" type="primary" size="mini" @click="onApply">去提现</u-button>
</view> -->
</view>
</view>
<view class="my-service">
<view class="service-title">我的服务</view>
<view class="service-content clearfix">
<block v-for="(item, index) in service" :key="index">
<view class="service-item" @click="handleService(item)">
<view class="item-icon">
<text class="iconfont" :class="[`icon-${item.icon}`]"></text>
</view>
<view class="item-name">{{ item.name }}</view>
<view class="item-badge" v-if="item.count && item.count > 0">
<text v-if="item.count <= 99" class="text">{{ item.count }}</text>
<text v-else class="text">99+</text>
</view>
</view>
<!-- <view v-if="item.type == 'button' && platform == 'MP-WEIXIN' && item.enabled" class="service-item">
<button class="btn-normal" :open-type="item.openType">
<view class="item-icon">
<text class="iconfont" :class="[`icon-${item.icon}`]"></text>
</view>
<view class="item-name">{{ item.name }}</view>
</button>
</view> -->
</block>
</view>
</view>
<view class="my-service">
<view class="service-title">本月收入</view>
<view class="service-content clearfix">
<view class="service-info">
<view class="item">
<view class="desc">已到账收入</view>
<!-- <u-icon name="question"></u-icon> -->
<view><text class="money">0.00</text></view>
</view>
<view class="item">
<view class="desc">待结算收入</view>
<view><text class="money">0.00</text></view>
</view>
</view>
</view>
</view>
<view class="my-service" @click="navTo('pages/dealer/team')">
<view class="service-title">我的邀请</view>
<view class="service-content clearfix">
<view class="service-info">
<view class="item">
<view class="desc">接受邀请</view>
<view><text class="money">0</text></view>
</view>
<view class="item">
<view class="desc">邀请成功</view>
<view><text class="money">0</text></view>
</view>
</view>
</view>
</view>
<!-- 绑定手机号 (第2种样式) -->
<!-- <view class="my-mobile2" @click="handleBindMobile()">
<view class="info">点击绑定手机号确保账户安全</view>
<view class="btn-bind">去绑定</view>
</view> -->
<!-- 退出登录 -->
<view v-if="isLogin" class="my-logout">
<view class="logout-btn" @click="handleLogout()">
<text>退出登录</text>
</view>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import store from '@/store/index.js'
import { getUser, updateUser } from '@/websoft/api/user.js'
import { getAuthCode, getPhoneNumber, login, register } from '@/websoft/api/login.js'
import { tenantId, roleId, username, password, appId } from '@/config.js';
import { ACCESS_TOKEN, USER_ID } from '@/store/mutation-types'
import storage from '@/utils/storage'
import { getMobile } from '@/utils/util.js'
import http from '@/websoft/api'
// 订单操作
const orderNavbar = [
// { id: 'all', name: '全部订单', icon: 'qpdingdan' },
{
id: 'payment',
name: '待付款',
icon: 'daifukuan',
count: 0
},
{
id: 'delivery',
name: '待配送',
icon: 'daifahuo',
count: 0
},
{
id: 'received',
name: '待收货',
icon: 'daishouhuo',
count: 0
},
{
id: 'comment',
name: '待评价',
icon: 'lingquan',
count: 0
},
]
/**
* 我的服务
* id: 标识; name: 标题名称; icon: 图标; type 类型(link和button); url: 跳转的链接
*/
const service = [
{id: 'get_order',name: '订单管理',icon: 'qpdingdan',type: 'link',url: 'pages/order/index'},
{id: 'equipment',name: '设备管理',icon: 'shouhuodizhi',type: 'link',url: 'pages/user/equipment/index'},
{id: 'saleman',name: '收益明细',icon: 'shouhuodizhi',type: 'link',url: 'pages/saleman/profir-log/profir-log'},
// {id: 'withdraw_kog',name: '提现记录',icon: 'shouhuodizhi',type: 'link',url: 'package/dealer/withdraw/apply'},
{id: 'help',name: '使用帮助',icon: 'bangzhu',type: 'link',url: 'pages/help/index'},
{id: 'administration',name: '关于我们',icon: 'sy-yh',type: 'link',url: 'pages/help/about'},
]
export default {
data() {
return {
bgImage: 'https://file.wsdns.cn/20230313/778ccc230d644b6ebc3c768b7d45229d.png',
// #ifdef MP-ALIPAY
canIUseAuthButton: my.canIUse('button.open-type.getAuthorize'),
// #endif
// 首次加载
isFirstload: true,
// 是否已登录
isLogin: false,
// 系统设置
setting: {},
// 当前用户信息
userInfo: {
nickname: '未登录'
},
form: {},
// 账户资产
assets: {
balance: '--',
points: '--',
coupon: '--',
browse: '--',
collection: '--',
follow: '--'
},
// 我的服务
service,
// 订单操作
orderNavbar,
// 当前用户待处理的订单数量
todoCounts: {
payment: 0,
deliver: 0,
received: 0,
notice: 10
}
}
},
onLoad() {
// 设置navbar标题、颜色
uni.setNavigationBarColor({
frontColor: '#000000',
backgroundColor: '#ffffff'
})
},
onShow() {
this.getUserInfo()
},
methods: {
getUserInfo() {
const { form } = this
const app = this
getUser().then(res => {
if( res.code == 0 && res.data.username != 'www') {
console.log("获取用户信息: ",res.data);
app.form = res.data
app.userInfo = res.data
store.dispatch('setUserInfo',res.data)
app.isLogin = true
}else{
app.isLogin = false
app.handleLogout()
}
})
},
// 跳转到服务页面
handleService({
url
}) {
if (url.slice(0, 4) == 'http') {
wx.openCustomerServiceChat({
extInfo: {
url: 'https://work.weixin.qq.com/kfid/kfc1693a8d29b84bc5e'
},
corpId: 'ww1c3f872ba0a39228',
success(res) {}
})
return;
}
if(!this.isLogin){
return false;
}
console.log("url: ",url);
this.$navTo(url)
},
onLogin(){
const app = this
// 未登录状态
if(!app.isLogin){
return this.$navTo('pages/login/login')
}
// #ifdef H5
// 跳转登录页面
return this.$navTo('pages/login/login')
// #endif
},
onUpdateAvatar() {
const { form, isLogin } = this
const app = this
// #ifdef MP-ALIPAY
console.log("// 自动获取头像昵称: ");
return false;
// 自动获取头像昵称
my.getOpenUserInfo({
fail: (res) => {
console.log("res1: ",res);
},
success: (res) => {
let user = JSON.parse(res.response).response // 以下方的报文格式解析两层 response
// 获取头像昵称
if(user && user.avatar){
form.avatar = user.avatar
form.nickname = user.nickName
updateUser(form).then(res => {
console.log("res3: ",res);
app.userInfo.avatar = user.avatar
app.userInfo.nickname = user.nickName
app.showToast('更新成功')
})
}
}
});
// #endif
},
// 显示toast信息
showToast(title, duration = 2000) {
this.$refs.uToast.show({ title, duration })
},
// 绑定手机号码
bindPhone() {
const app = this
const {
form
} = this
my.getPhoneNumber({
success: (res) => {
let encryptedData = res.response;
getPhoneNumber({encryptedData}).then(response => {
console.log("授权手机号码: ",response);
const json = JSON.parse(response.data)
if(json.mobile){
// 执行登录
updateUser({phone: json.mobile}).then(res => {
app.$toast('绑定成功')
app.userInfo.phone = json.mobile
})
}else{
app.bindPhone()
}
})
},
fail: (res) => {
console.log(res);
},
});
},
handleLogout(){
http.setConfig((config) => {
config.header = {};
config.header = {
AppId: appId,
tenantId: tenantId
};
return config
})
uni.clearStorage()
uni.clearStorageSync()
uni.redirectTo({
url: '/pages/login/login'
})
},
onApply(){
if(!this.isLogin){
return false;
}
// this.$navTo('pages/dealer/withdraw/apply')
this.$navTo('pages/withdraw/withdraw')
}
}
}
</script>
<style lang="scss" scoped>
.container {
padding-bottom: 60rpx;
}
// 页面头部
.main-header {
// background-color: #FBF7EF;
position: relative;
width: 100%;
height: 280rpx;
background-size: 100% 100%;
overflow: hidden;
display: flex;
align-items: center;
padding-left: 30rpx;
.bg-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
}
.star {
position: absolute;
opacity: 0.1;
color: #fff;
}
.star1 {
width: 150rpx;
height: 150rpx;
right: 80rpx;
top: 34rpx;
}
.star2 {
width: 100rpx;
height: 100rpx;
left: 40rpx;
top: 10rpx;
}
.star3 {
width: 70rpx;
height: 70rpx;
left: 140rpx;
bottom: 34rpx;
}
.user-info {
display: flex;
height: 120rpx;
z-index: 1;
.user-content {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 30rpx;
color: #ffffff;
.nick-name {
font-size: 34rpx;
font-weight: bold;
max-width: 270rpx;
}
.mobile {
margin-top: 15rpx;
font-size: 28rpx;
}
.user-grade {
align-self: baseline;
display: flex;
align-items: center;
background: #3c3c3c;
margin-top: 12rpx;
border-radius: 10rpx;
padding: 4rpx 12rpx;
.user-grade_icon .image {
display: block;
width: 32rpx;
height: 32rpx;
}
.user-grade_name {
margin-left: 5rpx;
font-size: 26rpx;
color: #EEE0C3;
}
}
.login-tips {
margin-top: 12rpx;
font-size: 30rpx;
}
}
}
}
// 角标组件
.item-badge {
position: absolute;
top: 0;
right: 55rpx;
// background: $main-bg;
background: #fa2209;
color: #fff;
border-radius: 100%;
min-width: 38rpx;
height: 38rpx;
display: flex;
justify-content: center;
align-items: center;
padding: 1rpx;
font-size: 24rpx;
}
// 我的钱包
.my-asset {
display: flex;
margin: 22rpx auto 22rpx auto;
padding: 22rpx 0;
width: 92%;
box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
border-radius: 24rpx;
background: #fff;
.asset-right {
width: 170rpx;
border-left: 1rpx solid #eee;
}
.asset-right-item {
text-align: center;
color: #545454;
.item-icon {
font-size: 44rpx;
}
.item-name {
margin-top: 14rpx;
font-size: 28rpx;
}
}
.asset-left-item {
text-align: center;
color: #666;
padding: 0 42rpx;
.item-value {
font-size: 34rpx;
color: $main-bg;
}
.item-name {
margin-top: 14rpx;
font-size: 28rpx;
}
}
}
// 订单操作
.order-navbar {
display: flex;
margin: 20rpx auto 20rpx auto;
padding: 0rpx 0 6rpx 0;
width: 94%;
// box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
font-size: 30rpx;
border-radius: 5rpx;
background: #fff;
&-item {
position: relative;
width: 25%;
.item-icon {
text-align: center;
margin: 0 auto;
padding: 10rpx 0;
color: #545454;
font-size: 44rpx;
}
.item-name {
font-size: 28rpx;
color: #545454;
text-align: center;
margin-right: 10rpx;
}
}
}
// 我的服务
.my-service {
margin: 22rpx auto 22rpx auto;
padding: 22rpx 0;
width: 92%;
box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
border-radius: 24rpx;
background: #fff;
.service-title {
padding-left: 24rpx;
font-weight: 500;
margin-bottom: 20rpx;
font-size: 34rpx;
}
.service-content {
.service-info {
display: flex;
justify-content: space-around;
.item {
display: flex;
flex-direction: column;
line-height: 52rpx;
color: #999999;
.desc {
color: #999999;
}
.money {
color: #3c3c3c;
font-weight: bold;
font-size: 50rpx;
}
}
}
margin-bottom: -20rpx;
.shop-service-item {
position: relative;
width: 33.33%;
float: left;
margin-bottom: 30rpx;
.item-icon {
text-align: center;
margin: 0 auto;
padding: 14rpx 0;
color: $main-bg;
font-size: 44rpx;
}
.item-name {
font-size: 28rpx;
color: #545454;
text-align: center;
}
}
.service-item {
position: relative;
width: 25%;
float: left;
margin-bottom: 30rpx;
.item-icon {
text-align: center;
margin: 0 auto;
padding: 14rpx 0;
color: $main-bg;
font-size: 44rpx;
}
.item-name {
font-size: 28rpx;
color: #545454;
text-align: center;
}
}
}
}
// 退出登录
.my-logout {
display: flex;
justify-content: center;
margin-top: 50rpx;
.logout-btn {
width: 60%;
margin: 0 auto;
font-size: 28rpx;
color: #616161;
border-radius: 20rpx;
border: 1px solid #dcdcdc;
padding: 16rpx 0;
text-align: center;
}
}
// 绑定手机号 样式1
.my-mobile {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16rpx 40rpx;
background: #FCEBD1;
.info {
color: #cd8c0c;
font-size: 28rpx;
}
.btn-bind {
list-style-type: none;
padding: 0px 16px !important;
background-color: #EAB766;
color: #fff;
border-radius: 30rpx;
font-size: 26rpx;
text-align: center;
}
}
// 绑定手机号 样式2
.my-mobile2 {
display: flex;
justify-content: space-between;
align-items: center;
margin: 20rpx auto 20rpx auto;
padding: 12rpx 40rpx;
width: 94%;
box-shadow: 0 1rpx 5rpx 0px rgba(0, 0, 0, 0.05);
font-size: 30rpx;
border-radius: 5rpx;
background: #fff;
.info {
// color: #cd8c0c;
font-size: 26rpx;
}
.btn-bind {
padding: 8rpx 24rpx;
background-color: #EAB766;
color: #fff;
border-radius: 30rpx;
font-size: 26rpx;
text-align: center;
button::after{
border: none;
}
}
}
.flex-box {
display: flex;
justify-content: space-between;
.more {
padding-right: 20rpx;
font-size: 26rpx;
color: #999999;
}
}
.main-header-btn {
width: 700rpx;
position: absolute;
bottom: 0;
z-index: 9999;
clear: both;
display: flex;
color: #ffffff;
justify-content: space-around;
padding: 12rpx 0;
}
</style>