Files
2025-04-30 14:04:34 +08:00

797 lines
25 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="grace-body">
<fu-custom bgColor="bg-white" :isBack="true" :isBottom="true">
<block slot="content">我的资料</block>
</fu-custom>
<!-- 个人资料表单 start -->
<form @submit="formSubmit" class="grace-form grace-margin-top">
<!-- 顶部头像模块 start -->
<view class="head_list cu-list menu">
<view class="cu-item">
<view class="content flex justify-between align-center">
<text class="title text-lg text-269">头像</text>
<view class="demo-face grace-relative grace-img-in">
<image :src="head_img || '/static/logo.png'" mode="aspectFill" @tap="openImg()"></image>
</view>
</view>
</view>
</view>
<!-- 顶部头像模块 end -->
<view class="cu-list menu ">
<view class="cu-item">
<view class="content flex justify-between align-center">
<text class="title text-lg text-269">ID</text>
<text class=" text-lg text-818 text-right">{{user_id}}</text>
</view>
</view>
<!-- 昵称 start -->
<view class="cu-item ">
<view class="content flex justify-between align-center">
<text class="title text-lg text-269">昵称</text>
<input type="text" :selection-start="user_name.length" :selection-end="user_name.length"
:cursor="user_name.length" class="input text-lg text-818" name="user_nickname" maxlength="10"
:auto-blur="true" v-model="user_nickname" :placeholder="'请输入昵称'" style="text-align: right" />
</view>
</view>
<!-- 昵称 end -->
<!-- 性别 start -->
<view class="cu-item">
<view class="content flex justify-between align-center" @click="toggleTab('selector')">
<text class="title text-lg text-269">性别</text>
<text class="text-818">{{ sexName }}</text>
</view>
</view>
<!-- 性别 end -->
<!-- 生日 start -->
<view class="cu-item">
<view class="content flex justify-between align-center">
<text class="title text-lg text-269">生日</text>
<view class="text-lg text-818 text-cut-2 text-align-right" @tap="toggleTab('date')">
<view >{{
dateValue
}}</view>
</view>
</view>
</view>
<!-- 生日 end -->
<!-- 手机号 statr -->
<!-- <view class="cu-item" @tap="handleJump" data-url="/pages/index/setting/verify-oldphone/index?isChange=1">
<view class="content flex justify-between align-center">
<text class="title text-lg text-333">{{i18n['手机号']}}</text>
<input type="text" class="input text-666 text-lg" name="mobile" maxlength="11" v-model="mobile"
disabled="" :placeholder="i18n['请输入昵称']" style="text-align: right" />
</view>
</view> -->
<!-- 手机号 end -->
<!-- 邮箱 start -->
<!-- <view class="cu-item">
<view class="content flex justify-between align-center">
<text class="title text-lg text-333">{{i18n['邮箱']}}</text>
<input type="text" class="input text-666 text-lg" name="user_email" v-model="user_email"
:placeholder="i18n['请绑定邮箱']" style="text-align: right" />
</view>
</view> -->
<!-- 邮箱 end -->
<!-- 所在地 start -->
<view class="cu-item">
<view class="content flex justify-between align-center">
<text class="title text-lg text-333 address">所在地</text>
<view class="text-lg text-666 text-cut-2 text-align-right" @tap="toggleTab('region')">
<view :class="name == '请选择' ? '' : 'address-select'">{{
name
}}</view>
</view>
</view>
</view>
<!-- 所在地 end -->
</view>
</form>
<!-- 个人资料表单 end -->
<!-- 选择城市 start -->
<w-picker :visible.sync="cityVisible" mode="region" :value="defaultVal" themeColor="#FF9300" default-type="value"
:hide-area="false" @confirm="onConfirm($event, 'region')" ref="region"></w-picker>
<!-- 选择城市 end -->
<!-- 选择生日 start -->
<view class="birthday-wrap">
<w-picker :visible.sync="timeVisible" mode="date" fields="day" :value="dateValue" themeColor="#FF9300" :disabled-after="true" @confirm="onConfirm($event, 'date')" ref="date">选择生日</w-picker>
</view>
<!-- 选择生日 end -->
<!-- 选择性别 start -->
<view class="sex-wrap">
<w-picker :visible.sync="visible" mode="selector" :value="sexName" default-type="name" themeColor="#FF9300" :default-props="defaultProps" :options="sex" @confirm="onConfirm($event,'selector')" ref="selector" >选择性别</w-picker>
</view>
<!-- 选择性别 end -->
<!-- 头像start -->
<fu-popup v-model="headerShow" borderRadius="16" :safeAreaInsetBottom="true" mode="bottom">
<view class="header-popup text-269 text-weight-400 text-lg text-center">
<view class="header-100" @click="chooseImage(0)">
修改头像
</view>
<view class="header-100 solid-top" @click="chooseImage(1)">
拍照
</view>
<view class="header-100 solid-top" @click="chooseImage(2)">
从手机相册选择
</view>
<view class="height-20"></view>
<view class="header-100 text-red" @click="headerShow = false">
取消
</view>
</view>
</fu-popup>
<!-- 头像end -->
<view class="footer">
<button class="bottom-action" @click="saveUserInfo()">保存</button>
</view>
<!-- 断网检测 start -->
<fu-notwork></fu-notwork>
<!-- 断网检测 end -->
</view>
</template>
<script>
// @see 引入组件wPicker
import wPicker from '@/pages/my/components/w-picker/w-picker.vue'
// @see 引入验证,上传图片
import { validate } from "@/common/utils/index";
import UploadImg from "@/common/utils/upload-image-old.js"
// @let {?Fuction} timer - 保存定时器
let timer = null;
export default {
components: {
wPicker,
},
data() {
return {
isLoading: false, // {Boolean} 是否加载中
userInfo: {}, // {Objcet} 用户信息
head_img: "", // {String} 用户头像
user_name: "", // {String} 用户姓名
user_id:'',
user_nickname: "", // {String} 用户昵称
user_email: "", // {String} 用户邮箱
sexIndex: 0, // {Number} 性别选项 12
sex: [{name: '保密',id: 0}, {name: "男",id: 1}, {name: "女",id: 2}], // {Array} 性别数组
defaultProps: {"label":"name","value":"id"},
dateValue: "请选择", // {String} 生日默认显示
mobile: "", // {String} 手机号码
name: "请选择", // {String} 所在地默认选择
mode: "region", // {String} 组件wPicker的类型
defaultVal: [1, 0, 0], // {Array} 城市编码
city1: [], // {Array} 对应的省市区
thumb: global.SYSTEM_CONFIG.logo, // {String} 默认图片
cityVisible: false, // {Boolean} 组件wPicker是否显示
// canLeave: true, // 是否有聚焦的输入框,有则提示保存
isCanSave: false, // 是否可以保存
form: {
user_nickname: "",
user_name: "",
user_email: "",
sexIndex: "",
dateValue: "",
defaultVal: "",
}, // 旧数据,用来判断是否修改
timeVisible:false,//时间组件
visible:false,//性别组件
headerShow:false,
};
},
computed:{
sexName(){
let name = this.sex[this.sexIndex].name;
return name;
}
},
watch: {
user_nickname(val) {
console.log(val, this.form.user_nickname, this.form.user_nickname == val);
if (val != this.form.user_nickname) {
this.isCanSave = true;
}
},
user_email(val) {
console.log(val, this.form);
if (val != this.form.user_email) {
this.isCanSave = true;
}
},
sexIndex(val) {
console.log(val, this.form);
if (val != this.form.sexIndex) {
this.isCanSave = true;
}
},
dateValue(val) {
console.log(val, this.form);
if (val != this.form.dateValue) {
this.isCanSave = true;
}
},
defaultVal(val) {
console.log(val, this.form);
if (String(val) != String(this.form.defaultVal)) {
this.isCanSave = true;
}
},
},
onLoad(option) {
// 创建一个变量 userInfo ,把全局的用户信息浅拷贝到 userInfo
let userInfo = Object.assign({}, global.userInfo);
this.userInfo = userInfo;
console.log(userInfo)
this.head_img = userInfo.avatar ? userInfo.avatar : "";
this.user_nickname = userInfo.nickname;
this.user_name = userInfo.nickname;
// this.user_email = userInfo.user_email;
this.user_id = userInfo.id
this.sexIndex = userInfo.gender ? userInfo.gender : 0;
// 用户的生日信息,有的话就放到全局方法里过滤一下,没有显示默认
this.dateValue = userInfo.birthday
? userInfo.birthday
: "请选择";
this.mobile = userInfo.mobile;
this.name = userInfo.province ? `${userInfo.province}-${userInfo.city}-${userInfo.district}` : "请选择";
// this.defaultVal = userInfo.address
// ? userInfo.address_code.split(",")
// : [1, 0, 0];
// 保存旧数据
this.form.user_nickname = this.user_nickname;
this.form.user_email = this.user_email;
this.form.sexIndex = this.sexIndex;
this.form.dateValue = this.dateValue;
this.form.defaultVal = this.defaultVal;
/**
* @description 监听手机号修改事件
*/
uni.$on("changeMobile", (data) => {
// console.log(data);
var mobile = data.substr(0, 3) + "****" + data.substr(7);
this.mobile = mobile;
});
/**
* @description 监听监听上传头像事件
*/
uni.$on("uPicCropper", (path) => {
this.uploadUserImg(path);
});
// 监听键盘
// uni.onKeyboardHeightChange((e) => {
// console.log(e, "eee");
// if (e.height == 0) {
// this.canLeave = true;
// } else {
// this.canLeave = false;
// }
// });
},
onUnload() {
// 关闭当前页面的监听事件
uni.$off("uPicCropper");
uni.$off("changeMobile");
},
// 返回拦截,如果有未保存的数据,弹出提示框
// onBackPress() {
// if (this.canLeave) {
// return false;
// } else {
// this.$util.showModal({
// title: "提示",
// content: "还有未保存的数据哦,是否离开?",
// success: (res) => {
// if (res.confirm) {
// uni.hideKeyboard();
// setTimeout(() => {
// uni.navigateBack();
// }, 100);
// }
// },
// });
// return true;
// }
// },
methods: {
/**
* @description 页面返回
* @param {delta} delta = 返回的页面数,如果 delta 大于现有页面数,则返回到首页
*/
back(delta) {
if (this.isCanSave) {
this.$util.showModal({
title: "提示",
content: "你有修改未保存,是否确认保存?",
success: (res) => {
if (res.confirm) {
this.saveUserInfo();
uni.hideKeyboard();
} else if (res.cancel) {
uni.navigateBack();
}
},
});
return false;
}
console.log("页面返回");
uni.navigateBack({
delta: delta || 1,
});
},
/**
* @event
* @description 所在地的选择弹窗显示
*/
toggleTab(ref) {
if (ref == 'region') {
if (this.userInfo.province) return false
}
this.$refs[ref].show();
},
// 保存用户信息
saveUserInfo() {
// 校验
// 如果不为空的情况下使用验证方法去验证邮箱号
// if(this.user_email){
// if (!validate(this.user_email, "email")) {
// this.$message.info(this.i18n["请输入正确的邮箱账号"]);
// return;
// }
// }
if(!this.user_nickname.trim()){
this.$message.info("请输入昵称");
return;
}
if(this.dateValue == '请选择'){
this.$message.info("请选择生日");
return;
}
if(this.name == '请选择'){
this.$message.info("请选择所在地");
return;
}
let addressArr = this.name.split('-')
let data = {
nickname: this.user_nickname,
gender: this.sexIndex,
birthday: this.dateValue,
avatar: this.head_img,
province: addressArr[0],
city: addressArr[1],
district: addressArr[2],
};
this.upload(data);
},
/**
* @event
* @description 表单上传事件
* @param {Object} val - 用户单独保存某一项时传进来的参数
*/
upload(val) {
this.$api.post(global.apiUrls.editUserinfo, val).then((res) => {
if (res.data.code == 1) {
// 更新本地缓存
uni.setStorageSync("USER_INFO", res.data.data.userinfo);
// 更新用户信息
this.userInfo = Object.assign({}, uni.getStorageSync("USER_INFO"));
// 更新global的用户信息
global.userInfo = res.data.data.userinfo;
uni.showToast({
title: res.data.msg,
duration: 1000,
icon: "none",
});
// 保存旧数据
this.form.user_nickname = this.user_nickname;
this.form.user_email = this.user_email;
this.form.sexIndex = this.sexIndex;
this.form.dateValue = this.dateValue;
this.form.defaultVal = this.defaultVal;
// 更新保存状态
this.isCanSave = false;
setTimeout(() => {
uni.navigateBack();
}, 500);
} else {
this.$message.info(res.data.msg);
}
});
},
/**
* @event
* @description 保存用户姓名事件
*/
saveUsername() {
if (
this.userInfo.user_name == this.user_name ||
this.user_name == "" ||
this.user_name.length > 10
)
return;
// this.upload({ user_name: this.user_name });
},
/**
* @event
* @description 性别选择事件
*/
bindPickerChange: function (e) {
this.sexIndex = e.detail.value;
if (this.userInfo.sex == this.sexIndex) return;
// this.upload({ sex: this.sexIndex });
},
/**
* @description 选择性别
*/
chooseSex() {
let that = this;
uni.showActionSheet({
itemList: that.sex,
success: function (res) {
console.log(["选中了第"] + (res.tapIndex + 1) + ["个按钮"]);
that.sexIndex = res.tapIndex;
if (that.userInfo.sex == that.sexIndex) return;
// that.upload({ sex: that.sexIndex });
},
fail: function (res) {
console.log(res.errMsg);
},
});
},
/**
* @event
* @description 生日选择事件
* @param {!Object} e - 用户生日弹窗选择的值
*/
bindDateChange: function (e) {
let selectTime = new Date(e.detail.value);
let nowTime = new Date();
if (selectTime > nowTime) {
this.$message.info("请选择正确的时间");
return;
}
this.dateValue = e.detail.value;
if (this.userInfo.birthday == this.dateValue || !this.dateValue) return;
// this.upload({ birthday: this.dateValue });
},
/**
* @event
* @description 所在地选择事件
* @param {Object} result - 用户所在地弹窗选择的值
*/
onConfirm(result,type) {
console.log(result,type);
if(type == 'date'){
this.dateValue = result.value;
}
if(type == 'region'){
let { province, city, area } = result.obj;
let text = [province.label, city.label, area.label];
let code = [province.value, city.value, area.value];
this.name = text.join("-");
// this.city1 = text;
// this.defaultVal = code;
// if (this.userInfo.address_code == this.defaultVal ||this.userInfo.address == this.name) return;
}
if(type == 'selector'){
this.sexIndex = result.value;
}
// this.upload({
// address: this.name,
// address_code: this.defaultVal,
// });
},
openImg(){
this.headerShow = true;
},
/**
* @event
* @description 选择头像事件
*/
chooseImage(tapIndex) {
let that = this;
if (tapIndex == 0) {
let img = that.head_img || that.thumb;
uni.navigateTo({
url:
'/pages/my/avatar-cropping/index?rectHeight=200&rectWidth=200&fileType=jpg&myImgUrl=' +
encodeURIComponent(img),
animationDuration: 0,
});
} else if (tapIndex == 1) {
uni.chooseImage({
count: 1,
sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ["camera"], // 可以指定来源是相册还是相机,默认二者都有
success: (res) => {
// 跳转到图片裁切页面
uni.navigateTo({
url:
'/pages/my/avatar-cropping/index?rectHeight=200&rectWidth=200&fileType=jpg&myImgUrl=' +
res.tempFilePaths[0],
animationDuration: 0,
});
},
fail: (err) => {
console.log(err);
if (err.errMsg.indexOf('No Permission')) {
// #ifdef APP-PLUS
// this.$message.info('暂无对应权限, 请前往APP设置中打开')
// #endif
}
}
});
} else {
uni.chooseImage({
count: 1,
sizeType: ["original", "compressed"], // 可以指定是原图还是压缩图,默认二者都有
sourceType: ["album"], // 可以指定来源是相册还是相机,默认二者都有
success: (res) => {
// 跳转到图片裁切页面
uni.navigateTo({
url: `/pages/my/avatar-cropping/index?rectHeight=200&rectWidth=200&fileType=jpg&myImgUrl=${res.tempFilePaths[0]}`,
animationDuration: 0,
});
},
fail: (err) => {
console.log(err);
if (err.errMsg.indexOf('No Permission')) {
// #ifdef APP-PLUS
// this.$message.info('暂无对应权限, 请前往APP设置中打开')
// #endif
}
}
});
}
this.headerShow = false;
},
// 表单提交
formSubmit: function (e) {
if (this.isLoading) return;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
var formData = e.detail.value;
// 添加头像
formData.head_img = this.head_img;
// 处理生日字段
formData.birthday =
formData.birthday.indexOf(this.i18n["选择"]) != -1 ? "" : formData.birthday;
// 所在地
// 进行表单验证操作
let validateRes = this.doValidate(formData);
if (validateRes) {
this.$message.info(validateRes);
return;
}
console.log('birthday', formData.birthday);
this.isLoading = true;
this.$api
.post(global.apiUrls.editUserinfo, formData)
.then((res) => {
// setTimeout(() => {
// this.isLoading = false;
// }, 500)
if (res.data.code == 1) {
this.isLoading = false;
// 更新本地缓存
uni.setStorageSync("USER_INFO", res.data.data.userinfo);
// 更新global
global.userInfo = res.data.data.userinfo;
this.$message.info("修改成功");
setTimeout(() => {
uni.navigateBack();
}, 500);
}
})
.catch((err) => {
this.isLoading = false;
console.log(err);
});
}, 300);
},
// 进行表单字段值校验
doValidate(formData) {
console.log(formData);
// 昵称
if (!formData.user_nickname) {
return "请输入您的用户昵称";
}
if (formData.user_nickname.length > 10) {
return "请检查您的昵称(最多10个字符)";
}
// 生日
if (!formData.birthday) {
return "请选择您的生日";
}
if (!this.name) {
return "请选择所在地";
}
return "";
},
/**
* @description 上传用户头像
*/
uploadUserImg(blob) {
uni.showLoading();
let _this = this;
// 开始上传
new UploadImg([blob], {
complete: function (res) {
console.log(res);
uni.hideLoading();
if (res.length) {
_this.head_img = res[0].path;
var formData = {
head_img: res[0].id,
};
// _this.$api
// .post(global.apiUrls.editUserinfo, formData)
// .then((res) => {
// if (res.data.code == 1) {
// // 更新本地缓存
// uni.setStorageSync("USER_INFO", res.data.data.userinfo);
// // 更新global
// global.userInfo = res.data.data.userinfo;
// }
// });
}
},
});
},
},
};
</script>
<style lang="scss" scoped>
.cu-list.menu {
margin-top: 0;
}
.demo text {
margin: 10upx;
}
.demo-face {
width: 100rpx;
height: 100rpx;
border-radius: 50%;
overflow: hidden;
}
.demo-face image {
width: 100rpx;
height: 100rpx;
border-radius: 60rpx;
}
.picker {
background: #FF9300;
width: 100%;
line-height: 40px;
}
.head_list {
background: #fff;
padding: 20rpx 0;
height: 152rpx;
position: relative;
&::after {
content: "";
position: absolute;
bottom: 0;
left: 32rpx;
width: 100%;
height: 1px;
background: #ddd;
transform: scaleY(0.5);
}
}
.other {
width: 500rpx;
text-align: right;
}
.address {
display: inline-block;
width: 110rpx;
}
.cu-item.arrow::before {
color: #bfbfbf !important;
}
.cu-list.menu>.cu-item {
height: 110rpx;
}
.address-select {
// display: inline-block;
width: 400rpx;
// overflow: hidden;
// white-space: nowrap;
// text-overflow: ellipsis;
}
.content .title {
display: inline-block;
width: 160rpx;
min-width: 160rpx;
}
.text-align-right {
text-align: right;
}
.footer{
position: fixed;
left: 0rpx;
bottom: 0rpx;
width: 100%;
height: 110rpx;;
height: calc(110rpx + constant(safe-area-inset-bottom));
height: calc(110rpx + env(safe-area-inset-bottom));
background: #FFFFFF;
.bottom-action {
height: 110rpx;
line-height: 110rpx;
background: #FFFFFF;
padding: 0;
border-radius: 0;
font-size: 32rpx;
font-family: PingFang SC;
font-weight: 500;
color: #FF9300;
&::after{
border: 0;
border-radius: 0;
}
}
}
.cu-list.menu-avatar>.cu-item:after, .cu-list.menu>.cu-item:after{
left: 32rpx;
}
.header-popup{
.height-20{
height:20rpx;
background: #f8f8f8;
}
.header-100{
height:100rpx;
line-height: 100rpx;
}
}
/deep/ .sex-wrap .w-picker-view{
height:228rpx;
}
/deep/ .birthday-wrap uni-picker-view .uni-picker-view-wrapper{
padding:0 80rpx;
}
</style>