665 lines
18 KiB
Vue
Raw Normal View History

2025-07-22 18:31:50 +08:00
<template>
<view class="page">
<!-- 顶部自定义导航 -->
<!-- <tn-nav-bar fixed alpha customBack>
<view slot="back" class='tn-custom-nav-bar__back' @click="goBack">
<text class='icon tn-icon-left-arrow'></text>
</view>
</tn-nav-bar> -->
<!-- :style="{paddingTop: vuex_custom_bar_height + 'px'}" -->
<view class="">
<view class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding">
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg"> 用户头像 </view>
<view class="tn-color-gray tn-padding-top-xs">
有趣的头像百里挑一
</view>
</view>
<button
class="avatar-wrapper"
open-type="chooseAvatar"
@chooseavatar="onChooseAvatar"
>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="logo-pic tn-shadow">
<view class="logo-image">
<view
class="tn-shadow-blur"
style="width: 80rpx; height: 80rpx; background-size: cover"
:style="{
backgroundImage: 'url(' + (user ? user.avatar : '') + ')',
}"
>
</view>
</view>
</view>
</view>
</button>
</view>
<view
class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding"
@click="showModalNickname"
>
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg"> 用户昵称 </view>
<view class="tn-color-gray tn-padding-top-xs">
{{ nickname }}
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view>
<view
class="tn-flex tn-flex-row-between tn-strip-bottom tn-padding"
@click="showModalMobile"
v-show="bindMobile > 0"
>
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg"> 绑定手机号 </view>
<view class="tn-color-gray tn-padding-top-xs">
{{ mobile }}
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view>
<!-- <view class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding" @click="showModalRealName">
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg">
姓名
</view>
<view class="tn-color-gray tn-padding-top-xs">
未填写
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view> -->
<picker
@change="bindGenderChange"
:value="indexGender"
:range="arrayGender"
>
<view
class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding"
>
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg"> 性别 </view>
<view class="tn-color-gray tn-padding-top-xs">
<view class="tn-color-gray">{{ arrayGender[indexGender] }}</view>
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view>
</picker>
<picker
@change="bindDateChange"
mode="date"
:value="birthday"
:start="startDate"
:end="endDate"
>
<view
class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding"
>
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg"> 生日 </view>
<view class="tn-color-gray tn-padding-top-xs">
{{ birthday }}
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view>
</picker>
<!-- <picker @change="bindPickerChange1" :value="index1" :range="array1">
<view class="tn-flex tn-flex-row-between tn-strip-bottom-min tn-padding">
<view class="justify-content-item">
<view class="tn-text-bold tn-text-lg">
职业
</view>
<view class="tn-color-gray tn-padding-top-xs">
{{array1[index1]}}
</view>
</view>
<view class="justify-content-item tn-text-lg tn-color-grey">
<view class="tn-icon-right tn-padding-top"></view>
</view>
</view>
</picker> -->
<tn-modal v-model="showNickname" :custom="true" :showCloseBtn="true">
<view class="custom-modal-content">
<view class="">
<view
class="tn-text-lg tn-text-bold tn-color-purplered tn-text-center tn-padding"
>修改昵称</view
>
<view
class="tn-bg-gray--light"
style="
border-radius: 10rpx;
padding: 20rpx 30rpx;
margin: 50rpx 0 60rpx 0;
"
>
<input
type="nickname"
v-model="nickname"
placeholder-style="color:#AAAAAA"
maxlength="20"
placeholder="请输入昵称"
/>
</view>
</view>
<view
class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center"
>
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="60%"
shadow
fontBold
@click="showNickname = false"
>
<text class="tn-color-white">确定</text>
</tn-button>
</view>
</view>
</tn-modal>
<tn-modal v-model="showMobile" :custom="true" :showCloseBtn="true">
<view class="custom-modal-content">
<view class="">
<view
class="tn-text-lg tn-text-bold tn-color-purplered tn-text-center tn-padding"
>变更手机号码</view
>
<view
class="tn-bg-gray--light"
style="
border-radius: 10rpx;
padding: 20rpx 30rpx;
margin: 50rpx 0 60rpx 0;
display: flex;
"
>
<input
placeholder="请填写手机号码"
name="input"
placeholder-style="color:#AAAAAA"
v-model="mobile"
maxlength="11"
style="width: 65%"
/>
<!-- #ifdef MP-WEIXIN -->
<tn-button
v-show="system && system.auto_bind_mobile"
open-type="getPhoneNumber"
@getphonenumber="(e) => getPhoneNumber(e)"
size="sm"
backgroundColor="#1A73E8"
fontColor="#fff"
>自动获取</tn-button
>
<!-- #endif -->
</view>
</view>
<view
class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center"
>
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="60%"
shadow
fontBold
@click="showMobile = false"
>
<text class="tn-color-white">确定</text>
</tn-button>
</view>
</view>
</tn-modal>
<!-- <tn-modal v-model="showMobile" :custom="true" :showCloseBtn="true">
<view class="custom-modal-content">
<view class="">
<view class="tn-text-lg tn-text-bold tn-color-purplered tn-text-center tn-padding">变更手机号码</view>
<view class="tn-bg-gray--light tn-color-gray"
style="border-radius: 10rpx;padding: 20rpx 30rpx;margin: 50rpx 0 60rpx 0;">
{{mobile || '尚未设置'}}
</view>
</view>
<view class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center">
<tn-button shape="round" backgroundColor="#1A73E8" padding="40rpx 0" width="60%" shadow fontBold
open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
<text class="tn-color-white">获取手机号</text>
</tn-button>
</view>
</view>
</tn-modal> -->
<!-- <tn-modal v-model="showRealName" :custom="true" :showCloseBtn="true">
<view class="custom-modal-content">
<view class="">
<view class="tn-text-lg tn-text-bold tn-color-purplered tn-text-center tn-padding">请输入真实姓名
</view>
<view class="tn-bg-gray--light"
style="border-radius: 10rpx;padding: 20rpx 30rpx;margin: 50rpx 0 60rpx 0;">
<input placeholder="请填写姓名" name="input" placeholder-style="color:#AAAAAA"
maxlength="20"></input>
</view>
</view>
<view class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center">
<tn-button shape="round" backgroundColor="#1A73E8" padding="40rpx 0" width="60%" shadow fontBold
open-type="getMobileNumber">
<text class="tn-color-white"> </text>
</tn-button>
</view>
</view>
</tn-modal> -->
</view>
<!-- 悬浮按钮-->
<view class="tn-flex tn-footerfixed">
<!-- <view class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center">
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="80%"
shadow
fontBold
@click="changePassword"
>
<text class="tn-color-white">修改密码</text>
</tn-button>
</view> -->
<view class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center">
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="80%"
shadow
fontBold
@click="save"
>
<text class="tn-color-white">保存</text>
</tn-button>
</view>
</view>
<!-- <view class="tn-flex tn-footerfixed">
<view class="tn-flex-1 justify-content-item tn-margin-sm tn-text-center">
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="60%"
shadow
fontBold
@click="save"
>
<text class="tn-color-white">修改密码</text>
</tn-button>
<tn-button
shape="round"
backgroundColor="#1A73E8"
padding="40rpx 0"
width="60%"
shadow
fontBold
@click="save"
>
<text class="tn-color-white">保存</text>
</tn-button>
</view>
</view> -->
<login ref="login" v-on:login_success="ajax"></login>
<kz-wx-privacy-check></kz-wx-privacy-check>
</view>
</template>
<script>
import userApi from "@/common/api/user.js";
export default {
data() {
return {
showNickname: false,
showMobile: false,
showRealName: false,
user: '',
nickname: "",
mobile: "",
indexGender: 0,
arrayGender: ["女", "男"],
birthday: "",
tempAvatarUrl: "",
bindMobile: 1, // 0=不绑定1=可选绑定2=强制绑定
system: null,
};
},
computed: {
startDate() {
return this.getDate("start");
},
endDate() {
return this.getDate("end");
},
},
onLoad() {
this.ajax();
let system = uni.getStorageSync("system");
this.system = system;
if (system && system.bind_mobile) {
this.bindMobile = system.bind_mobile;
}
},
onShow() {
uni.$on("login_success", (data) => {
console.log("login_success", data);
this.setUser(data.user);
});
},
onHide() {
uni.$off("login_success");
},
methods: {
ajax() {
console.log("ajax");
userApi.getUserInfo(this).then((res) => {
this.setUser(res.data);
});
},
setUser(user) {
this.user = user;
uni.setStorageSync("user", this.user);
this.nickname = this.user.nickname;
this.mobile = this.user.mobile;
this.indexGender = this.user.gender;
this.birthday = this.user.birthday || "2000-01-01";
},
// 弹出昵称模态框
showModalNickname(event) {
this.showNickname = true;
},
// 弹出手机模态框
showModalMobile(event) {
this.showMobile = false;
},
// 弹出真实姓名模态框
showModalRealName(event) {
this.showRealName = true;
},
// 选择头像
async onChooseAvatar(e) {
console.log("e: ", e);
// this.tempAvatarUrl = e.detail.avatarUrl
// this.user.avatar = this.tempAvatarUrl
// 上传头像
if (e.detail.avatarUrl) {
let newAvatar = "";
let uploadResult = null;
await this.utils.uploadFile(this, e.detail.avatarUrl).then((res) => {
if (res.code == 1) {
newAvatar = res.data.fullurl;
uploadResult = "";
} else {
uploadResult = res.msg;
}
});
if (uploadResult) {
this.utils.alert(uploadResult);
return;
}
if (newAvatar) {
this.tempAvatarUrl = newAvatar;
this.user.avatar = newAvatar;
}
}
// 强制刷新
// this.$forceUpdate();
},
// 获取手机号
async getPhoneNumber(e) {
console.log("绑定手机号获取到的参数: ", e);
uni.showLoading({
title: "获取中...",
});
// 获取微信号绑定的手机号
userApi.getWechatPhone(this, { code: e.code }).then((res) => {
console.log("getWechatPhone res", res);
if (res.code == 1) {
this.mobile = res.data.mobile;
} else {
this.utils.alert(res.msg);
}
});
},
// 选择性别
bindGenderChange: function (e) {
console.log("gender", e);
this.indexGender = e.detail.value;
},
bindPickerChange1: function (e) {
this.index1 = e.detail.value;
},
bindDateChange: function (e) {
this.birthday = e.detail.value;
},
getDate(type) {
const date = new Date();
let year = date.getFullYear();
let month = date.getMonth() + 1;
let day = date.getDate();
if (type === "start") {
year = year - 60;
} else if (type === "end") {
year = year + 2;
}
month = month > 9 ? month : "0" + month;
day = day > 9 ? day : "0" + day;
return `${year}-${month}-${day}`;
},
// 获取微信手机号
// getPhoneNumber(e) {
// console.log("getPhoneNumber e", e);
// if (!e.iv || !e.encryptedData) {
// this.utils.toast("用户取消授权");
// return;
// }
// const data = {
// iv: e.iv,
// encryptedData: e.encryptedData,
// };
// // 后端处理后返回解密的手机号码
// userApi.getWechatPhone(this, data).then((res) => {
// console.log("getWechatPhone res", res);
// if (res.code == 1) {
// this.mobile = res.data.phoneNumber;
// } else {
// this.utils.alert(res.msg);
// }
// });
// },
// 修改密码
changePassword() {
uni.navigateTo({
url: "/pages/user/password",
});
},
// 保存设置
async save() {
if (this.bindMobile == 2 && !this.mobile) {
this.utils.alert("请设置手机号码");
return;
}
// let newAvatar = ''
// let uploadResult = ''
// 上传头像
// if (this.tempAvatarUrl) {
// await this.utils.uploadFile(this, this.tempAvatarUrl).then(res => {
// if (res.code == 1) {
// newAvatar = res.data.fullurl
// uploadResult = ''
// } else {
// uploadResult = res.msg
// }
// })
// }
// console.log('uploadResult', uploadResult)
// console.log('newAvatar', newAvatar)
// if (uploadResult) {
// this.utils.alert(uploadResult)
// return
// }
let data = {
nickname: this.nickname,
mobile: this.mobile,
gender: this.indexGender,
birthday: this.birthday,
};
if (this.tempAvatarUrl) {
data["avatar"] = this.tempAvatarUrl;
}
console.log("save user data", data);
await userApi.save(this, data).then((res) => {
console.log("user save res", res);
if (res.code == 1) {
uni.setStorageSync("user", this.user);
this.utils.alert("保存成功");
} else {
this.utils.alert(res.msg);
}
});
},
},
};
</script>
<style lang="scss">
page {
background-color: #fff !important;
}
/* 胶囊*/
.tn-custom-nav-bar__back {
width: 60%;
height: 100%;
position: relative;
display: flex;
justify-content: space-evenly;
align-items: center;
box-sizing: border-box;
background-color: rgba(0, 0, 0, 0.15);
border-radius: 1000rpx;
border: 1rpx solid rgba(255, 255, 255, 0.5);
color: #ffffff;
font-size: 18px;
.icon {
display: block;
flex: 1;
margin: auto;
text-align: center;
}
}
/* 间隔线 start*/
.tn-strip-bottom-min {
width: 100%;
border-bottom: 1rpx solid #f8f9fb;
}
.tn-strip-bottom {
width: 100%;
border-bottom: 20rpx solid rgba(241, 241, 241, 0.8);
}
/* 间隔线 end*/
/* 用户头像 start */
.logo-image {
width: 80rpx;
height: 80rpx;
position: relative;
}
.logo-pic {
background-size: cover;
background-repeat: no-repeat;
// background-attachment:fixed;
background-position: top;
border: 2rpx solid rgba(255, 255, 255, 0.05);
box-shadow: 0rpx 0rpx 80rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 50%;
overflow: hidden;
// background-color: #FFFFFF;
}
.avatar-wrapper {
background: none;
}
/* 底部悬浮按钮 start*/
.tn-tabbar-height {
min-height: 100rpx;
height: calc(120rpx + env(safe-area-inset-bottom) / 2);
}
.tn-footerfixed {
position: fixed;
width: 100%;
bottom: calc(30rpx + env(safe-area-inset-bottom));
z-index: 1024;
box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0);
}
/* 底部悬浮按钮 end*/
</style>