shop_uniapp/bundle/pages/user_profile/user_profile.vue
2024-09-25 12:28:08 +08:00

701 lines
18 KiB
Vue
Raw Permalink 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="user-profile p-t-10">
<view class="content">
<view class="bg-white">
<view class="user-avatar-box flex-col col-center">
<button class="column column-center" hover-class="none" open-type="chooseAvatar"
@chooseavatar="onChooseAvatar" @click="onChooseAvatar">
<image class="user-avatar"
:src="userInfo.avatar1!= '' ? userInfo.avatar:'https://zjeloong.oss-cn-hangzhou.aliyuncs.com/uniapp/portrait_empty.png'">
</image>
<view class="muted xs">点击修改头像</view>
</button>
</view>
<view class="row-info flex bdb-line" @tap="changeName">
<view class="label md">昵称</view>
<view class="md flex-1">{{ userInfo.nickname }}</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex bdb-line" @tap="changeSex">
<view class="label md">性别</view>
<view class="md flex-1" :class="userInfo.sex == 0 ? 'muted' : ''">{{ userInfo.sex }}</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex bdb-line">
<view class="label md">手机号</view>
<view class="md flex-1" :class="{ 'muted': !userInfo.mobile }">
{{ userInfo.mobile ? userInfo.mobile : "未绑定" }}</view>
<!-- #ifdef H5 || APP-PLUS -->
<view class="bd-btn br60 flex row-center" @tap="showModifyMobile">
{{ userInfo.mobile ? '更换手机号' : '绑定手机号' }}</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<button class="bd-btn br60 flex row-center" size="sm" open-type="getPhoneNumber"
@getphonenumber="getPhoneNumber">{{ userInfo.mobile ? '更换手机号' : '绑定手机号' }}</button>
<!-- #endif -->
</view>
<!-- #ifndef MP-WEIXIN-->
<view class="row-info flex row-between" @tap="showPwdPop">
<view class="label md">登录密码</view>
<view class="flex">
<view class="muted">点击设置</view>
<u-icon name="arrow-right" />
</view>
</view>
<!-- #endif -->
<view class="row-info flex row-between bdb-line mt10" @tap="showModifyPayPassword">
<view class="label md">支付密码</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex row-between bdb-line mt10" @tap="goToExplain(0)">
<view class="label md">服务协议</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex row-between bdb-line" @tap="goToExplain(1)">
<view class="label md">隐私政策</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex row-between bdb-line" @tap="goLicense()">
<view class="label md">资质信息</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex row-between bdb-line" @tap="SubscribeMessage()">
<view class="label md">允许通知</view>
<u-icon name="arrow-right" />
</view>
<view class="row-info flex row-between">
<view class="label md">关于我们</view>
<view>v{{ version }}</view>
</view>
</view>
</view>
<view class="bg-primary br60 white save-btn flex row-center lg" @tap="logout">退出登录</view>
<!-- 版权信息 -->
<view class="license xs text-center" v-if="appConfig.copyright_info || appConfig.icp_number">
<view>{{ appConfig.copyright_info }}</view>
<view>{{ appConfig.icp_number }}</view>
</view>
<!-- #ifndef MP-WEIXIN -->
<u-popup type="center" closeable v-model="showMobile" mode="center" border-radius="14">
<view class="modify-container bg-white" v-show="showMobile">
<view class="title xl text-center">{{ userInfo.mobile ? '更换手机号' : '绑定手机号' }}</view>
<u-field label="+86" v-if="userInfo.mobile" label-width="100" disabled
v-model="userInfo.mobile"></u-field>
<u-field label="+86" v-else label-width="140" v-model="new_mobile" placeholder="请输入手机号"></u-field>
<u-field v-model="mobileCode" label="验证码" label-width="140" placeholder="请输入验证码">
<view slot="right" class="primary send-code-btn br60 flex row-center" @tap="sendSmsFun">
<u-verification-code :keep-running="true" unique-key="mobile" ref="uCode"
@change="codeChange"></u-verification-code>
<view class="sm">{{ codeTips }}</view>
</view>
</u-field>
<u-field label="新手机号" v-if="userInfo.mobile" label-width="140" placeholder="请输入新的手机号码"
v-model="new_mobile"></u-field>
<view class="primary m-t-10 xs">{{ userInfo.mobile ? '更改' : '绑定' }}手机号码成功后,您的账号将会变更为该设置号码</view>
<view class="btn bg-primary white flex row-center" @tap="changeUserMobileFun">确定</view>
</view>
</u-popup>
<!-- #endif -->
<u-popup v-model="showNickName" :closeable="true" :maskCloseAble="false" mode="center" border-radius="14">
<view class="modify-container bg-white" style="width: 70vw;padding: 24rpx">
<view class="title xl text-center">修改用户名</view>
<form @submit="changeNameConfirm">
<u-form-item label="新昵称" :labelWidth="120">
<input style="height: 60rpx;" class="nr" :value="userInfo.nickname" name="nickname"
type="nickname" placeholder="请输入新的昵称">
</input>
</u-form-item>
<button class="btn bg-primary white flex row-center" form-type="submit">确定</button>
</form>
</view>
</u-popup>
<!-- #ifndef MP-WEIXIN -->
<u-popup v-model="showPwd" closeable mode="center" border-radius="14">
<view class="modify-container bg-white">
<view class="title xl text-center">设置密码</view>
<u-field label="+86" disabled label-width="100" v-model="userInfo.mobile"></u-field>
<u-field v-model="pwdCode" label="验证码" label-width="140" placeholder="请输入验证码">
<view slot="right" class="primary send-code-btn br60 flex row-center" @tap="sendSmsFun('ZFMM')">
<u-verification-code unique-key="password" :keep-running="true" ref="uCode"
@change="codeChange"></u-verification-code>
<view class="sm">{{ codeTips }}</view>
</view>
</u-field>
<u-field label="设置密码" label-width="140" type="password" placeholder="请输入密码" v-model="pwd"></u-field>
<u-field label="确认密码" label-width="140" type="password" placeholder="再次输入新密码确认"
v-model="comfirmPwd"></u-field>
<view class="btn bg-primary white flex row-center" @tap="forgetPwdFun">确定</view>
</view>
</u-popup>
<!-- #endif -->
<u-popup v-model="showPayPassword" closeable mode="center" border-radius="14">
<view class="modify-container bg-white">
<view class="title xl text-center">设置支付密码</view>
<u-field label="+86" disabled label-width="100" v-model="userInfo.mobile" :border-bottom="false"></u-field>
<u-field v-model="payPwdCode" label="验证码" label-width="140" placeholder="请输入验证码">
<view slot="right" class="primary send-code-btn br60 flex row-center" @tap="sendSmsFun">
<u-verification-code unique-key="password" :keep-running="true" ref="uCode"
@change="codeChange"></u-verification-code>
<view class="sm">{{ codeTips }}</view>
</view>
</u-field>
<u-field label="支付密码" label-width="140" type="password" placeholder="请输入6位整数支付密码" v-model="payPwd" :maxlength="6"></u-field>
<u-field label="确认密码" label-width="140" type="password" placeholder="再次输入6位整数支付密码"
v-model="comfirmPayPwd" :maxlength="6"></u-field>
<view class="btn bg-primary white flex row-center" @tap="forgetPayPwdFun">确定</view>
</view>
</u-popup>
<u-picker mode="selector" v-model="showPicker" :default-selector="[0]" :range="sexList" @confirm="onConfirm" />
</view>
</template>
<script>
import {
userLogout,
getUserInfo,
getWxMnpMobile,
setUserInfo,
setWechatInfo,
changeUserMobile
} from "@/api/user";
import {
baseURL,
version
} from '@/config/app';
import {
sendSms,
forgetPwd,
forgetPayPwd
} from '@/api/app'
import {
SMSType
} from '@/utils/type'
import {
mapGetters
} from 'vuex'
import {
uploadFile,
isWeixinClient,
trottle,
} from '@/utils/tools'
import {
getWxCode,
getUserProfile
} from '@/utils/login'
const FieldType = {
NONE: '',
SEX: 'sex',
NICKNAME: 'nickname',
AVATAR: 'avatar',
MOBILE: 'mobile'
}
export default {
name: 'userProfile',
data() {
return {
action: baseURL + '/api/file/formimage',
fileList: [],
userInfo: {},
new_mobile: '',
pwdCode: '',
mobileCode: '',
newNickname: '',
sexList: ['男', '女'],
fieldType: FieldType.NONE,
showPicker: false,
showMobile: false,
showPwd: false,
showNickName: false,
codeTips: '',
canSendSms: true,
pwd: '',
comfirmPwd: '',
smsType: '',
code: '',
version,
showPayPassword: false,
payPwdCode: '',
payPwd: '',
comfirmPayPwd: ''
}
},
methods: {
SubscribeMessage:function(){
uni.requestSubscribeMessage({
tmplIds: ['kKgDn4gfOLtH9KFbqQcCd4VZN03FOoUYoCKciIhgvks'],
success (res) {
console.log(111111)
},
fail(res) {
console.log(res.errMsg);
},
complete() {
resolve();
}
});
},
codeChange(text) {
this.codeTips = text;
},
onSuccess(e) {
console.log(e)
},
uploadImage(path) {
uni.showLoading({
title: '正在上传中...',
mask: true
});
uploadFile(path).then(res => {
uni.hideLoading()
this.setUserInfoFun(res.uri)
}).catch(() => {
uni.hideLoading()
this.$toast({
title: "上传失败"
})
})
},
onChooseAvatar(e) {
this.fieldType = FieldType.AVATAR;
// #ifndef MP-WEIXIN
// 此为uView的跳转方法,详见"文档-JS"部分,也可以用uni的uni.navigateTo
uni.$u.route({
// 关于此路径,请见下方"注意事项"
url: '/components/uview-ui/components/u-avatar-cropper/u-avatar-cropper',
// 内部已设置以下默认参数值,可不传这些参数
params: {
// 输出图片宽度,高等于宽,单位px
destWidth: 300,
// 裁剪框宽度,高等于宽,单位px
rectWidth: 200,
// 输出的图片类型,如果'png'类型发现裁剪的图片太大,改成"jpg"即可
fileType: 'jpg',
}
})
// #endif
// #ifdef MP-WEIXIN
if (e.detail.avatarUrl) {
this.uploadImage(e.detail.avatarUrl)
}
// #endif
},
// 修改用户昵称
async changeNameConfirm(e) {
this.fieldType = FieldType.NICKNAME;
this.newNickname = e.detail.value.nickname
if (!this.newNickname) return this.$toast({
title: '请输入新的昵称'
})
await this.setUserInfoFun(this.newNickname)
this.showNickName = false;
},
// 更新小程序头像信息
async getUserProfileFun() {
const {
userInfo
} = await getUserProfile()
const {
avatarUrl,
nickName,
gender
} = userInfo
const {
msg,
code
} = await setWechatInfo({
nickname: nickName,
avatar: avatarUrl,
sex: gender
})
if (code == 1) {
this.$toast({
title: msg
});
this.getUserInfoFun()
}
},
// end
async logout() {
const [req, res] = await uni.showModal({
title: '提示',
content: '是否退出登录?'
})
if (!res.confirm) return
//  退出登录
userLogout().then(res => {
if (res.code == 1) {
this.$store.commit("logout");
this.$toast({
title: '退出成功'
})
setTimeout(() => {
this.$Router.replaceAll('/pages/login/login')
}, 500)
}
})
},
goToExplain(value) {
this.$Router.push({
path: '/bundle/pages/server_explan/server_explan',
query: {
type: value
}
})
},
goLicense() {
this.$Router.push({
path: '/bundle/pages/license/license',
query: {
id: ''
}
})
},
// 发送短信
sendSmsFun(type) {
if (!this.$refs.uCode.canGetCode) return
sendSms({
mobile: this.userInfo.mobile || this.new_mobile,
key: this.smsType,
}).then(res => {
if (res.code == 1) {
this.$toast({
title: res.msg
});
this.$refs.uCode.start();
}
})
},
getUserInfoFun() {
getUserInfo().then(res => {
if (res.code == 1) {
this.userInfo = res.data;
}
})
},
// 更换手机号
showModifyMobile() {
this.new_mobile = '';
this.showMobile = true
this.smsType = this.userInfo.mobile ? SMSType.CHANGE_MOBILE : SMSType.BIND
},
//更换支付密码
showModifyPayPassword() {
this.showPayPassword = true
this.smsType = SMSType.ZHZFMM
},
changeUserMobileFun() {
if (!this.mobileCode) {
this.$toast({
title: '请输入验证码'
})
return;
}
if (!this.new_mobile) {
this.$toast({
title: '请输入新的手机号码'
})
return;
}
changeUserMobile({
mobile: this.userInfo.mobile,
new_mobile: this.new_mobile,
code: this.mobileCode,
action: this.userInfo.mobile ? 'change' : 'binding'
}).then(res => {
if (res.code == 1) {
this.showMobile = false;
this.$toast({
title: res.msg
})
this.getUserInfoFun();
}
})
},
// 修改用户信息
async setUserInfoFun(value) {
let ugc = false // 微信安全审核
// #ifdef MP-WEIXIN
ugc = true
// #endif
const res = await setUserInfo({
field: this.fieldType,
value: value,
ugc
})
if (res.code == 1) {
this.$toast({
title: res.msg
});
this.getUserInfoFun()
}
},
onConfirm(value) {
this.setUserInfoFun(value[0] + 1);
this.showPicker = false;
},
changeSex(e) {
this.showPicker = true;
this.fieldType = FieldType.SEX;
},
// 修改密码
showPwdPop() {
if (!this.userInfo.mobile) {
this.$toast({
title: '请绑定手机后再设置密码'
})
return;
}
this.smsType = SMSType.FINDPWD
this.showPwd = true
},
forgetPwdFun() {
let {
pwdCode,
pwd,
comfirmPwd
} = this;
if (!pwdCode) {
this.$toast({
title: '请输入短信验证码'
});
return;
}
if (!pwd) {
this.$toast({
title: '请输入新密码'
});
return;
}
if (!comfirmPwd) {
this.$toast({
title: '再次输入新密码确认'
});
return;
}
if (pwd != comfirmPwd) {
this.$toast({
title: '两次密码输入不一致'
});
return;
}
let data = {
mobile: this.userInfo.mobile,
code: pwdCode,
password: pwd,
repassword: comfirmPwd
};
forgetPwd(data).then(res => {
if (res.code == 1) {
this.showPwd = false;
this.$toast({
title: '设置密码成功'
});
this.getUserInfoFun();
}
})
},
// 支付密码
goToPayPassword() {
this.$Router.push({
path: '/bundle/pages/pay_password/index'
})
},
// 设置支付密码
forgetPayPwdFun() {
let {
payPwdCode,
payPwd,
comfirmPayPwd
} = this;
if (!payPwdCode) {
this.$toast({
title: '请输入短信验证码'
});
return;
}
if (payPwd.length != 6 || comfirmPayPwd.length != 6) {
this.$toast({
title: '支付密码长度需要设置6位'
});
return;
}
if (!payPwd) {
this.$toast({
title: '请输入新支付密码'
});
return;
}
if (!comfirmPayPwd) {
this.$toast({
title: '再次输入新支付密码确认'
});
return;
}
if (payPwd != comfirmPayPwd) {
this.$toast({
title: '两次密码输入不一致'
});
return;
}
let data = {
mobile: this.userInfo.mobile,
code: payPwdCode,
pay_password: payPwd,
repassword: comfirmPayPwd
};
forgetPayPwd(data).then(res => {
if (res.code == 1) {
this.showPayPassword = false;
this.$toast({
title: '支付密码设置成功'
}, {
tab: 1,
url: '/pages/user/user',
endtime: 500
});
}
})
},
// 修改昵称
changeName() {
this.fieldType = FieldType.NICKNAME;
this.newNickname = '';
this.showNickName = true;
},
// 微信获取手机号
// #ifdef MP-WEIXIN
async getPhoneNumber(e) {
console.log(e, this.code)
const {
encryptedData,
iv
} = e.detail;
const params = {
code: this.code,
encrypted_data: encryptedData,
iv
}
this.fieldType = FieldType.MOBILE
if (encryptedData) {
const {
data,
code,
msg
} = await getWxMnpMobile(params)
if (code == 1) {
this.$toast({
title: msg
});
// #ifdef MP-WEIXIN
getWxCode().then(res => {
this.code = res
})
// #endif
this.getUserInfoFun()
}
}
},
// #endif
},
onLoad() {
this.getUserInfoFun()
// #ifdef MP-WEIXIN
getWxCode().then(res => {
this.code = res
})
// #endif
uni.$on('uAvatarCropper', path => {
console.log(path)
this.uploadImage(path)
})
this.getUserProfileFun = trottle(this.getUserProfileFun, 500, this)
},
onUnload() {
uni.$off('uAvatarCropper')
},
computed: {
...mapGetters(['token', 'appConfig'])
}
}
</script>
<style lang="scss">
.user-profile {
min-height: calc(100vh - env(safe-area-inset-bottom));
display: flex;
flex-direction: column;
.content {
// flex: 1;
border-top-left-radius: 28rpx;
border-top-right-radius: 28rpx;
.user-avatar-box {
padding: 30rpx;
.user-avatar {
width: 120rpx;
height: 120rpx;
border-radius: 50%;
}
}
.row-info {
padding: 30rpx 20rpx;
.label {
width: 180rpx;
}
.bd-btn {
padding: 8rpx 24rpx;
border: 1px solid $-color-primary;
color: $-color-primary;
}
}
.bdb-line {
border-bottom: 1rpx solid #e5e5e5;
}
}
.license {
margin-top: 20rpx;
color: #a7a7a7;
}
.save-btn {
margin: 40rpx 30rpx 0;
height: 88rpx;
}
.modify-container {
padding: 30rpx;
width: 620rpx;
border-radius: 30rpx;
.title {
padding: 26rpx 0rpx;
}
.btn {
height: 80rpx;
border-radius: 20rpx;
margin: 60rpx 50rpx 0;
}
}
}
</style>