2025-07-30 19:58:32 +08:00

665 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="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>