| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 | <template>	<view >			<image mode="widthFix" src="/static/wd_bg_login.jpg" class="login_full_img"></image>			<view  class="loginBox">		<view style="display: flex;height: 160rpx;justify-content: center;" >			<view style="text-align: center;">				<image @click="editAvatar"  :src="form.avatar?$method.splitImgHost(form.avatar, true):''" class="avatar"></image>				<view class="nick">{{form.realname}}</view>				<view>					<view class="item" @click="editNickName">						<view>我的昵称</view>						<view>{{form.nickname}}<u-icon name="arrow-right" color="#999999" size="28"></u-icon></view>					</view>					<view>						<picker @change="bindPickerChangeSex" :value="form.sex-1" range-key="key" :range="array_sex">							<view class="item">								<view>性别</view>								<view class="rBox">									<view class="picker">{{ array_sex[form.sex-1].key }}</view>									<u-icon name="arrow-right" color="#999999" size="28"></u-icon>								</view>							</view>						</picker>					</view>					<view>						<picker mode="date" :end="$method.getDate()" :value="form.userBirth" @change="bindDateChange">							<view class="item">								<view>年龄</view>								<view class="rBox">									<view class="picker">{{ $method.getYears(form.userBirth) }} 岁</view>									<u-icon name="arrow-right" color="#999999" size="28"></u-icon>								</view>							</view>						</picker>					</view>					<view class="item" @click="editIdCard">						<view>关联学员身份</view>						<view style="display: flex;">							<view style="text-align: right;">								<view>{{ form.realname }}</view>								<view>{{ form.idCard }}</view>							</view>							<!-- <u-icon name="arrow-right" color="#999999" size="28"></u-icon> -->						</view>					</view>					<view>						<pick-regions :defaultRegion="defaultRegionCode" @getRegion="handleGetRegion2">							<view class="item">								<view>所在城市</view>								<view class="rBox">									<view class="picker">{{ form.province || '-' }} {{ form.city || '-' }} {{ form.district || '-' }}</view>									<u-icon name="arrow-right" color="#999999" size="28"></u-icon>								</view>							</view>						</pick-regions>					</view>					<view class="item" @click="showPhone">						<view>手机号码</view>						<view>{{ form.telphone }}							<!-- <u-icon name="arrow-right" color="#999999" size="28"></u-icon> -->						</view>					</view>				</view>			</view>		</view>			</view>	<u-modal v-model="n_show" @confirm="confirmNick" :show-cancel-button="true" title="修改昵称">		<view class="slot-content">			<u-input v-model="nickname" type="nickname" placeholder="请输入昵称" />		</view>	</u-modal>	<u-modal v-model="id_show" ref="uModal" :async-close="true" @confirm="confirmId" :show-cancel-button="true" title="修改关联信息">		<view class="slot-content">			<u-input v-model="realname" @input="inputName(realname)" type="nickname" placeholder="请输入真实姓名" />			<u-input v-model="idCard" type="idcard" placeholder="请输入身份证" />		</view>	</u-modal>		<u-popup v-model="showPhoneModal" mode="bottom" class="modal" border-radius="32">		<view class="modal__content">			<view class="top">				<view class="top__line"></view>				<view class="top__text">更换手机号码</view>			</view>			<view class="form">				<u-form :model="telForm" ref="telForm">					<view class="input-wrap">						<u-form-item ref="tel" prop="tel"><u-input placeholder="手机号码" v-model="telForm.tel" /></u-form-item>						<u-form-item prop="code">							<u-input placeholder="验证码" v-model="telForm.code" />							<view  slot="right" @click="getCode" class="getcode">{{codeTips}}</view>						</u-form-item>					</view>					<view class="btns">						<view class="cancel" @click="showPhoneModal = false">取消</view>						<view class="submit" :class="{able:canSubmit()}" @click="bindNewSubmit">确认更换</view>					</view>				</u-form>			</view>		</view>	</u-popup>	<u-verification-code seconds="60" ref="uCode" @change="codeChange"></u-verification-code>	<u-navbar   title="我的资料" :border-bottom="false" background="{ background: '#ffffff',opacity:0.4; }" title-color="#ffffff" back-icon-color="#ffffff">			</u-navbar>	</view></template><script>	import {mapGetters} from 'vuex';export default {	data() {		return {			showPhoneModal:false,			form:{				avatar:'',				userBirth:''			},			telForm:{				tel:'',				code:'',			},			array_sex: [{				key:'男',				value:1,			},{				key:'女',				value:2,			}],			n_show:false,			defaultRegionCode: '440112',			id_show:false,			nickname:'',			realname:'',			idCard:'',			codeTips:'',			avatarUrl:'',			avatarOssKey:'',			rules: {				tel: [					{ 						required: true, 						message: '请输入手机号', 						// 可以单个或者同时写两个触发验证方式 						trigger: ['change']					},					{						validator: (rule, value, callback) => {							// 上面有说,返回true表示校验通过,返回false表示不通过							// this.$u.test.mobile()就是返回true或者false的							return this.$u.test.mobile(value);						},						message: '手机号码格式不正确',						// 触发器可以同时用blur和change						trigger: ['change'],					}				],				code: [					{ 						required: true, 						message: '请输入验证码', 						// 可以单个或者同时写两个触发验证方式 						trigger: ['change'],					}				],			},					};	},	onShow(){		this.form = this.userInfo		console.log(this.form,'0999')	},	onLoad(option) {	},	methods: {		inputName(value) {			if(value.trim()) {				var reg = /[^\u0391-\uFFE5A-Za-z]/g;				let newVal = value.trim().replace(reg,'')																this.$nextTick(() => {					this.realname = newVal;				})			}		},		bindPickerChangeSex(e) {			let data = {sex:+e.detail.value+1}			this.submitForm(data)		},		uploadFile(options, int) {			var self = this;			return new Promise((resolve, reject) => {				var data = {					imageStatus: int				};				self.$api.aliyunpolicy(data).then(res => {					console.log(res.data,6)					if(res.data.code!=200){						self.$method.showToast('签名错误'+JSON.stringify(res.data))						return					}					var ossToken = res.data.data.resultContent;					if(ossToken.host==null||ossToken.host==undefined){						self.$method.showToast('上传路径报错'+JSON.stringify(res.data))						return					}					uni.uploadFile({						url: ossToken.host,						name: 'file',						filePath: options,						fileType: 'image',						header: {							AuthorizationToken: 'WX ' + uni.getStorageSync('token')						},						formData: {							key: ossToken.dir,							OSSAccessKeyId: ossToken.accessid,							policy: ossToken.policy,							Signature: ossToken.signature,							callback: ossToken.callback,							success_action_status: 200						},						success: result => {							// if (result.statusCode === 200) {								this.$u.toast('上传成功')								self.avatarOssKey = ossToken.dir;								resolve();							// } else {							// 	uni.showToast({							// 		title: '上传失败',							// 		icon: 'none'							// 	});							// 	return;							// }						},						fail: error => {							uni.showToast({								title: '上传接口报错'+error,								icon: 'none'							});							return;						},					});				});			});		},		imageInfos(){			var self = this			return new Promise((resolve, reject) => {				uni.getImageInfo({					src: self.avatarUrl,					success: async res => {						let canvasWidth = res.width; //图片原始长宽						let canvasHeight = res.height;						if (canvasWidth > 2000 || canvasHeight > 2000) {							uni.compressImage({								src: self.avatarUrl,								quality: 75,								width: '35%',								height: '35%',								success: async rest => {									const waitUpload = await self.uploadFile(rest.tempFilePath, 0);									resolve(waitUpload)								} 							});						} else if (canvasWidth > 1000 || canvasHeight > 1000) {							uni.compressImage({								src: self.avatarUrl,								quality: 75,								width: '50%',								height: '50%',								success: async rest => {									const waitUpload = await self.uploadFile(rest.tempFilePath, 0);									resolve(waitUpload)								} 							});						} else {							const waitUpload = await self.uploadFile(self.avatarUrl, 0);							resolve(waitUpload)						}					},					fail: (err) => {						this.$u.toast('图片上传失败')					}				});			});		},		async submitAvatar(){			const waitYS = await this.imageInfos();			 let data = {avatar:this.avatarOssKey}			this.submitForm(data) 		},		editAvatar(){			let that = this			uni.chooseImage({			    count: 1, //默认9			    sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有			    success: function (res) {					console.log('res:,', res)					that.avatarUrl = res.tempFilePaths[0]					that.submitAvatar()			    }			});		},		//城市		handleGetRegion2(region) {			let data = {province:region[0].name,city:region[1].name,district:region[2].name}			this.submitForm(data)		},		bindDateChange(e) {			let data = {userBirth:e.detail.value}			this.submitForm(data)		},		editIdCard(){			return;			this.id_show = true			this.realname = this.form.realname			this.idCard = this.form.idCard		},		confirmId(){			if(this.realname==''){				uni.showModal({					title: "提示",					content: '真实姓名不能为空',					showCancel: false				})				this.$refs.uModal.clearLoading();				return			}			if(this.idCard==''){												uni.showModal({					title: "提示",					content: '身份证ID不能为空',					showCancel: false				})				this.$refs.uModal.clearLoading();				return			}			let idCardRe18 = /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/			let idCardRe15 =  /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/			if(!idCardRe18.test(this.idCard) && !idCardRe15.test(this.idCard)){								uni.showModal({					title: "提示",					content: '身份证ID不正确',					showCancel: false				})				this.$refs.uModal.clearLoading();				return			}			let data = {realname:this.realname,idCard:this.idCard}			this.submitForm(data)		},		confirmNick(){			if(this.nickname==''){				uni.showModal({					title: "提示",					content: '昵称不能为空',					showCancel: false				})				return			}			let data = {nickname:this.nickname}			this.submitForm(data)		},		editNickName(){			this.n_show = true			this.nickname = this.form.nickname		},		submitForm(data){			let self = this			this.$api.appuserInfo(data).then(res => {				if (res.data.code === 200) {					setTimeout(()=>{						this.id_show = false;						uni.showToast({							title: '提交成功',							icon: 'none'						});					},500);					self.$api.refreshUserInfo() 				}else{					uni.showToast({						title: res.data.msg,						icon: 'none'					});				}			});		},		showPhone() {			return;			this.showPhoneModal = true;			this.$refs.telForm.setRules(this.rules)		},		canSubmit() {			if(this.telForm.tel && this.telForm.code) {				return true;			}			return false;		},				codeChange(text) {			this.codeTips = text;		},		getCode() {			let that = this			if(that.$refs.uCode.canGetCode) {				if(that.$refs.tel.validateState == 'success') {					let datas = {tel:this.telForm.tel}					that.$api.bindNewSms(datas).then(						res => {							if (res.data.code == 200) {								that.$u.toast('验证码已发送');								// 通知验证码组件内部开始倒计时								that.$refs.uCode.start();							} else {								that.$u.toast(res.data.msg);							}						},						err => {							console.log(err);						}					);					} else {					this.$refs.tel.onFieldChange()				}			}		},		bindNewSubmit() {			let that = this			this.$refs.telForm.validate(valid => {				if(valid) {					let datas = {						tel:this.telForm.tel,						code:this.telForm.code,					}					that.$api.bindNewTel(datas).then(						res => {							if (res.data.code == 200) {								that.showPhoneModal = false;								that.$api.refreshUserInfo();								uni.showModal({									title: '提示',									content: '绑定成功',									showCancel:false,								});							} else {								that.$u.toast(res.data.msg);							}						},						err => {													}					);				}			})		}	},	computed: {...mapGetters(['userInfo'])},	watch:{		userInfo(val, oldVal){//普通的watch监听		     if(val){				 this.form = this.userInfo			 }		 },	}	};</script><style >	page{		background-color: #F0F1F5;	}	</style><style scope lang="scss">	.slot-content{		margin: 30rpx;		color: #606266;	}	.rBox{		display: flex;	}	.item{		width: 686rpx;		height: 80rpx;		background: #FFFFFF;		border-radius: 24rpx;		display: flex;		color: #666666;		align-items: center;		justify-content: space-between;		padding: 0 20rpx;		margin-top: 30rpx;		font-size: 24rpx;	}	.nick{		font-size: 36rpx;		font-weight: bold;		color: #007AFF;		margin-top: 20rpx;	}	.loginBox{		position: relative;		top: -80rpx;	}	.avatar{		width: 160rpx;		height: 160rpx;		border-radius: 50%;	}	.login_full_img {		display: block;		width: 100%;		height: 140px !important;		z-index: -999;		top: 0;	}	.full_img {		display: block;		width: 100%;		z-index: -999;		top: 0;	}	.loginBtn{		width: 526rpx;		height: 80rpx;		background: linear-gradient(90deg, #015EEA, #00C0FA);		box-shadow: 0rpx 10rpx 16rpx 4rpx rgba(1, 99, 235, 0.04);		border-radius: 40rpx;		color: #FFFFFF;		line-height: 80rpx;		margin: 0 auto;		margin-top: 50rpx;	}		.modal {		&__content {			position:relative;			width: 750rpx;			height: 1208rpx;			background: #FFFFFF;			box-shadow: 0px 0px 16rpx 4rpx #919CB2;			border-radius: 32rpx 32rpx 0rpx 0rpx ;			overflow: hidden;						.top {				border-bottom: 1rpx solid #eee;				&__line {					position: absolute;					top: 10rpx;					left: 50%;					transform: translateX(-50%);					width: 80rpx;					height: 8rpx;					background-color: #999;					border-radius: 4rpx;				}								&__text {					height: 77rpx;					text-align: center;					line-height: 90rpx;					font-size: 24rpx;					color: #999;					position: relative;				}			}						.form {				margin: 24rpx auto 0;				width: 686rpx;				height: 360rpx;				background: #FFFFFF;				border-radius: 24rpx 24rpx 24rpx 24rpx;								.input-wrap {					padding:20rpx 80rpx;										.getcode {						color:#007AFF;						font-size: 30rpx;					}				}								.btns {					display: flex;					justify-content: space-between;					margin-top:160rpx;					.cancel {						font-weight: bold;						text-align: center;						line-height: 80rpx;						color:#007AFF;						width: 200rpx;						height: 80rpx;						font-size: 30rpx;						background: #F5F5F5;						border-radius: 40rpx 40rpx 40rpx 40rpx;					}										.submit {						font-weight: bold;						opacity: 0.6;						text-align: center;						line-height: 80rpx;						color:#fff;						font-size: 30rpx;						width: 438rpx;						height: 80rpx;						background: #007AFF;						border-radius: 40rpx 40rpx 40rpx 40rpx;												&.able {							opacity: 1;						}					}				}			}		}	}</style>
 |