Newer
Older
xinJiangMiniProgranm / packageMine / accountBound / accountBound.vue
lyg on 1 Mar 2024 7 KB 细节优化
<!-- 账号绑定 -->
<template>
	<view class="account-bound">
		<view class="main">
			<u--form
				labelPosition="left"
				:model="form"
				:rules="rules"
				labelWidth="100"
				ref="form">
				<u-form-item label="手机号" prop="name" borderBottom :required="true">
					<u--input
						placeholder="手机号"
						v-model="form.name"
						border="none"
						clearable
					></u--input>
				</u-form-item>
				
				<u-form-item label="密码" prop="password" borderBottom :required="true">
					<u--input
						placeholder="密码"
						v-model="form.password"
						border="none"
						clearable
					></u--input>
				</u-form-item>
				
				<u-form-item label="验证码" prop="code" borderBottom :required="true">
					<u--input
						placeholder="验证码"
						v-model="form.code"
						border="none"
					></u--input>
					<view class="code-img-wrapper" @click="updateImageCode">
					  <!-- <canvas style="width: 280rpx;height: 140rpx;" canvas-id="canvas"></canvas> -->
					  <image :src="codeUrl" style="width: 140px;height: 60px;"></image>
					</view>
				</u-form-item>
			</u--form>
		</view>
		<view class="button" @click="submit">确定</view>
		<view class="reister">
			<view> </view>
			<!-- <view @click="changePage('changePassword')">忘记密码</view> -->
			<view @click="changePage('register')">还没账号?去注册</view>
		</view>
	</view>

</template>

<script>
	import { Mcaptcha  } from '../../common/mcaptcha.js';
	import { loginUser,encryption, getCode, decryption } from '../../api/mine.js'
	import { hexMD5, b64Md5} from '../../common/md5.js'
	export default {
		data() {
			return {
				timeStr: '', // 验证码时间戳
				codeUrl: '', // 验证码图片
				rules: {
					// 用户名
					'name': [
						{
							type: 'string',
							required: true,
							message: '请填写用户名',
							trigger: ['blur', 'change']
						},
						{
							// 自定义验证函数
							validator: (rule, value, callback) => {
								// 上面有说,返回true表示校验通过,返回false表示不通过
								// uni.$u.test.mobile()就是返回true或者false的
								return uni.$u.test.mobile(value);
							},
							message: '请输入正确的手机号',
							// 触发器可以同时用blur和change
							trigger: ['change','blur'],
						}
						// {
						// 	min: 8,
						// 	max: 30,
						// 	message: '长度在8-30个字符之间'
						// }
					],
					// 新密码规则
					'password': [
						{
							type: 'string',
							required: true,
							message: '请填写密码',
							trigger: ['blur', 'change']
						},
						// {
						// 	min: 8,
						// 	max: 30,
						// 	message: '长度在8-30个字符之间'
						// },
					],
					// 验证码规则
					'code': [
						{
							type: 'string',
							required: true,
							message: '请填写验证码',
							trigger: ['blur', 'change']
						},
						{
							// 自定义验证函数
							validator: (rule, value, callback) => {
								let validate = this.mcaptcha.validate(value)
								if(validate) {
									return true
								}
								callback(new Error('验证码错误'));
							},
						}
					],
				},
				form: {
					name: '',  //用户名
					password: '',  //密码
					code: '',  //验证码
					token:''
				},
			}
		},
		onReady() {
			this.$refs.form.setRules(this.rules);
			// this.mcaptcha = new Mcaptcha({
			// 	el: 'canvas',
			// 	width: 140,
			// 	height: 80,
			// 	createCodeImg: ""
			// });
			this.fetchCodeURl() // 获取验证码
		},
		methods: {
			submit() {
				this.$refs.form.validate().then(async (res) => {
					// uni.$u.toast('校验通过')
					// 登录接口
					// 账号密码加密
					const name = await encryption(this.form.name)
                    // 提交信息
					const data = {
						timeStr:this.timeStr,
						'userInfoVo.account': name,
						'userInfoVo.password': hexMD5(this.form.password),
						'userInfoVo.verifyCode': this.form.code,
						token:''
					}
					loginUser(data).then(res => {
						// console.log(res, '用户信息')
						uni.$u.toast('登陆成功')
						const userInfo = res
						decryption(res.account).then(res => {
							wx.setStorageSync('userAccount', res)
						})
						decryption(res.phone).then(res => {
							wx.setStorageSync('userPhone', res)
						})
						wx.setStorageSync('userInfoxj', userInfo)
							wx.switchTab({
							url:'/pages/mine/mine'
						})
					}).catch((error) => {
						console.log(error)
						// 登陆失败更换验证码
						this.updateImageCode()
					})
					// 模拟登录成功
					// const userInfo = {
					// 	id:'b56d2019f49353aa85a93c06228b8d80', 
					// 	account:'test001',
					// 	name:'姓名',
					// 	sex:'性别',
					// 	nation:'民族', 
					// 	IDCard:'身份证号',
					// 	phone:'13712345678', 
					// 	email:'123456789@163.com',
					// 	country:'国家', 
					// 	province:'省', 
					// 	city:'市', 
					// 	county:'县', 
					// 	address:'详细地址', 
					// 	regTime:'注册时间'}
					// wx.setStorageSync('userInfoxj', userInfo)
					// setTimeout(() => {
					// 	wx.switchTab({
					// 		url:'/pages/mine/mine'
					// 	},500)
					// })
				}).catch(errors => {
					console.log(errors, 'errors')
					uni.$u.toast('请将信息填写完整')
				})
			},
			// // 刷新验证码
			// updateImageCode() {
			//   this.mcaptcha.refresh()
			// },
			// 换验证码
			updateImageCode() {
				this.fetchCodeURl()
			},
			// 获取验证码
			fetchCodeURl() {
				var that = this
				that.timeStr = new Date().getTime()
				wx.request({
				  url: `https://www.xjwljb.com/webserver/captchaController/generateVerifyCodeOfReport.do?timeStr=${that.timeStr}`,
				  method: 'POST',
					data: {
						index: '0.6261334077388199'
					},
					header:{
						'content-type': 'application/x-www-form-urlencoded'
					},
				  success(res) {
						if(res.statusCode === 200) {
							that.codeUrl = res.data
						}
				  },
				  fail(err) {
						console.log('fail', err)
				    reject(err);
				  },
				});
			},
			// 忘记密码或注册
			changePage(val) {
				let url = `/packageMine/${val}/${val}`
				wx.navigateTo({
					url: url
				})
			},
		}
	}
</script>

<style lang="scss" scoped>
	.reister{
		padding: 0 10px;
		display: flex;
		justify-content: space-between;
	}
	.account-bound {
		width: 100%;
		height: 100%;
		padding: 40rpx 20rpx;
		box-sizing: border-box;
		background: linear-gradient(#bed5fe 0%, #eef1fd 100%);
		.main {
			padding: 20rpx 20rpx 40rpx 20rpx;
			box-sizing: border-box;
			background-color: #fff;
			border-radius: 16rpx;
		}
		.button {
			width: 100%;
			display: flex;
			justify-content: center;
			align-items: center;
			padding: 20rpx;
			color: #fff;
			font-weight: 600;
			letter-spacing: 4rpx;
			background-color: #408bf6;
			border: 2rpx solid #408bf6;
			border-radius: 10rpx;
			margin: 64rpx 0 32rpx 0;
			white-space: nowrap;
			box-sizing: border-box;
			&:active {
				background-color: #fff;
				color: #408bf6;
			}
		}
	}
</style>
<style lang="scss">
	.account-bound {
		.u-form-item__body__left__content__label {
			white-space: nowrap;
			font-weight: 600;
		}
		.u-form-item__body__right__content__slot {
			display: flex;
			flex-direction: row;
			justify-content: space-between;
			align-items: center;
		}
		.u-form-item {
			margin-bottom: 20rpx;
		}
	}
</style>