Browse Source

2023-10-24

cmy 2 years ago
parent
commit
9c5c9210b1
5 changed files with 734 additions and 61 deletions
  1. 2 2
      manifest.json
  2. 8 0
      pages.json
  3. 50 58
      pages/users/login/index.vue
  4. 673 0
      pages/users/login/register.vue
  5. 1 1
      pages/users/user_spread_code/index.vue

+ 2 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "壹柒科技",
     "appid" : "__UNI__B0B5BE7",
     "description" : "壹柒科技",
-    "versionName" : "2.7.0",
-    "versionCode" : 270,
+    "versionName" : "2.7.1",
+    "versionCode" : 271,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {

+ 8 - 0
pages.json

@@ -747,6 +747,14 @@
             }
           }
         },
+		// #ifdef H5
+		{
+		  "path": "login/register",
+		  "style": {
+		    "navigationBarTitleText": "注册"
+		  }
+		},
+		// #endif
 		{
 		  "path": "supplier/index",
 		  "style": {

+ 50 - 58
pages/users/login/index.vue

@@ -67,6 +67,9 @@
 			</view>
 			<view class="logon" @click="loginMobile" v-if="current !== 0">登录</view>
 			<view class="logon" @click="submit" v-if="current === 0">登录</view>
+			<!-- #ifdef H5 -->
+			<view class="logon" @click="domApp" style="margin-top: 20rpx;">下载APP</view>
+			<!-- #endif -->
 			<!-- #ifdef APP-PLUS -->
 			<!-- <view class="appLogin" v-if="!appLoginStatus && !appleLoginStatus">
 				<view class="hds">
@@ -98,21 +101,6 @@
 			ref="verify"></Verify>
 		<view class="copyright" v-if="copyrightContext">{{copyrightContext}}</view>	
 		<!-- <view class="copyright" v-else>Copyright ©2014-2023 <text class="domain" @click="domainTap('https://www.crmeb.com')">www.crmeb.com</text></view> -->
-		<!-- #ifdef H5 -->
-			<view class="titleBox titleflex" v-if="showDom">
-				<view class="title">
-					是否下载app
-				</view>
-				<view class="titleflex right">
-					<view class="buttom domApp" @click="domApp">
-						下载App
-					</view>
-					<view class="buttom out" @click="showDom=false">
-						关闭
-					</view>
-				</view>
-			</view>
-		<!-- #endif -->
 	</view>
 </template>
 <script>
@@ -675,18 +663,53 @@
 							'token': data.token,
 							'time': data.expires_time - this.$Cache.time()
 						});
-						let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
-						that.$Cache.clear(BACK_URL);
-						getUserInfo().then(res => {
-							this.keyLock = true
-							that.$store.commit("SETUID", res.data.uid);
-							that.$store.commit("UPDATE_USERINFO", res.data);
-							uni.reLaunch({
-								url: backUrl
-							});
-						}).catch(error => {
-							this.keyLock = true
-						})
+						
+						// #ifdef H5
+						 uni.showModal({
+						 	title: '提示',
+						 	content: '是否下载app',
+						 	success: res => {
+								if(res.confirm){
+									domApp()
+								}else if(res.cancel){
+									let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+									that.$Cache.clear(BACK_URL);
+									getUserInfo().then(res => {
+										this.keyLock = true
+										that.$store.commit("SETUID", res.data.uid);
+										that.$store.commit("UPDATE_USERINFO", res.data);
+										uni.reLaunch({
+											url: backUrl
+										});
+									}).catch(error => {
+										this.keyLock = true
+									})
+								}
+							},
+						 	fail: () => {},
+						 	complete: () => {}
+						 });
+						 
+						 // #endif
+						 
+						 // #ifndef H5
+						 let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+						 that.$Cache.clear(BACK_URL);
+						 getUserInfo().then(res => {
+						 	this.keyLock = true
+						 	that.$store.commit("SETUID", res.data.uid);
+						 	that.$store.commit("UPDATE_USERINFO", res.data);
+						 	uni.reLaunch({
+						 		url: backUrl
+						 	});
+						 }).catch(error => {
+						 	this.keyLock = true
+						 })
+						 // #endif
+						
+						
+						
+						
 					})
 					.catch(e => {
 						this.keyLock = true
@@ -1082,35 +1105,4 @@
 			}
 		}
 	}
-	.titleBox {
-		padding: 10rpx 30rpx;
-		background-color: #FFF;
-		position:fixed;
-		top:0;
-		left:0;
-		right:0;
-		.right {
-			.buttom {
-				padding: 10rpx 20rpx;
-				border: 1px solid #e3e3e3;
-				width: 150rpx;
-				flex-shrink: 0;
-				text-align: center;
-				margin-left: 10rpx;
-				font-size: 22rpx;
-				line-height: 1;
-	
-				&.domApp {
-					color: #FFF;
-					background-color: $kf-theme;
-				}
-			}
-		}
-	}
-	.titleflex {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		flex-shrink: 0;
-	}
 </style>

+ 673 - 0
pages/users/login/register.vue

@@ -0,0 +1,673 @@
+<template>
+	<view class="login-wrapper" :style="colorStyle">
+		<view class="login-top"></view>
+		<view class="shading">
+			<image :src="logoUrl" v-if="logoUrl" />
+			<image src="../static/logo2.png" v-else />
+		</view>
+		<view class="whiteBg">
+			<view class="tips">
+				<view class="tips-btn on">
+					<view>注册账号</view>
+					<view class="line"></view>
+				</view>
+			</view>
+			<view class="list">
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="../static/phone_1.png" class="itemImg-add"></image>
+						<input type="text" placeholder="输入手机号码" v-model="account" maxlength="11" />
+					</view>
+				</view>
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="../static/phone_1.png" class="itemImg-add"></image>
+						<input type="text" placeholder="输入邀请码" v-model="spread_spid" maxlength="11" />
+					</view>
+				</view>
+				<view class="item">
+					<view class="acea-row row-middle">
+						<image src="../static/code_2.png" class="item-img"></image>
+						<input type="text" placeholder="填写验证码" maxlength="6" class="codeIput" v-model="captcha" />
+						<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
+							{{ text }}
+						</button>
+					</view>
+				</view>
+			</view>
+			<view class="logon" @click="loginMobile">注册</view>
+			<!-- #ifdef H5 -->
+			<view class="logon" style="margin-top: 20rpx;" @click="domApp">下载APP</view>
+			<!-- #endif -->
+			<view class="protocol">
+				<checkbox-group @change='ChangeIsDefault'>
+					<checkbox :class="inAnimation?'trembling':''" @animationend='inAnimation=false'
+						:checked="protocol ? true : false" />已阅读并同意 <text class="main-color"
+						@click="privacy('user')">《用户协议》</text>
+					与<text class="main-color" @click="privacy('privacy ')">《隐私协议》</text>
+				</checkbox-group>
+			</view>
+		</view>
+		<view class="bottom"></view>
+		<Verify @success="success" :captchaType="'blockPuzzle'" :imgSize="{ width: '330px', height: '155px' }"
+			ref="verify"></Verify>
+		<view class="copyright" v-if="copyrightContext">{{copyrightContext}}</view>
+
+	</view>
+</template>
+<script>
+	import dayjs from "@/plugin/dayjs/dayjs.min.js";
+	import sendVerifyCode from "@/mixins/SendVerifyCode";
+	import {
+		getAppVersion
+	} from '@/api/api.js';
+	import {
+		loginMobile,
+		registerVerify,
+		getCodeApi,
+		getUserInfo,
+	} from "@/api/user";
+	import attrs, {
+		required,
+		alpha_num,
+		chs_phone
+	} from "@/utils/validate";
+	import {
+		validatorDefaultCatch
+	} from "@/utils/dialog";
+	import {
+		getLogo
+	} from "@/api/public";
+	// import cookie from "@/utils/store/cookie";
+	import {
+		VUE_APP_API_URL
+	} from "@/utils";
+	// #ifdef APP-PLUS
+	import {
+		wechatAppAuth
+	} from '@/api/api.js'
+	// #endif
+	const BACK_URL = "login_back_url";
+	import colors from '@/mixins/color.js';
+	import Verify from '../components/verify/verify.vue';
+	export default {
+		name: "Login",
+		components: {
+			Verify
+		},
+		mixins: [sendVerifyCode, colors],
+		data: function() {
+			return {
+				inAnimation: false,
+				protocol: false,
+				account: "",
+				password: "",
+				spread_spid: '',
+				captcha: "",
+				type: "login",
+				logoUrl: "",
+				keyCode: "",
+				keyLock: true,
+				copyrightContext: ''
+			};
+		},
+		onLoad(res) {
+			let self = this;
+			if (res.spid) {
+				self.spread_spid = res.spid;
+			}
+		},
+		mounted: function() {
+			// this.getCode();
+			this.getLogoImage();
+			this.spread_spid = this.$Cache.get("spid");
+			if (!this.spid) {
+				this.spread_spid = this.$Cache.get("spid");
+			}
+		},
+		methods: {
+			// #ifdef H5
+			domApp() {
+				const bool = navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger';
+				if (bool) {
+					uni.showModal({
+						title: '提示',
+						content: '无法在微信中下载,请用浏览器打开下载',
+						showCancel: false,
+					});
+				} else {
+					getAppVersion().then((res) => {
+						console.log(res, 'res');
+						window.open(res.data.apk)
+					}).catch((err) => {
+						console.log(err, 'err');
+					})
+				}
+			},
+			// #endif
+			ChangeIsDefault(e) {
+				this.$set(this, 'protocol', !this.protocol);
+			},
+			success(data) {
+				this.$refs.verify.hide()
+				getCodeApi()
+					.then(res => {
+						this.keyCode = res.data.key;
+						this.getCode(data);
+					})
+					.catch(res => {
+						this.$util.Tips({
+							title: res
+						});
+					});
+			},
+			code() {
+				let that = this
+				if (!that.protocol) {
+					this.inAnimation = true
+					return that.$util.Tips({
+						title: '请先阅读并同意协议'
+					});
+				}
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				this.$refs.verify.show()
+			},
+			async getLogoImage() {
+				let that = this;
+				getLogo(2).then(res => {
+					that.logoUrl = res.data.logo_url;
+					that.copyrightContext = res.data.copyrightContext;
+				});
+			},
+			async loginMobile() {
+				let that = this;
+				if (!that.protocol) {
+					this.inAnimation = true
+					return that.$util.Tips({
+						title: '请先阅读并同意协议'
+					});
+				}
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				if (!that.captcha) return that.$util.Tips({
+					title: '请填写验证码'
+				});
+				if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
+					title: '请输入正确的验证码'
+				});
+
+
+				if (this.keyLock) {
+					this.keyLock = !this.keyLock
+				} else {
+					return that.$util.Tips({
+						title: '请勿重复点击'
+					});
+				}
+				loginMobile({
+						phone: that.account,
+						captcha: that.captcha,
+						spread_spid: that.spread_spid
+					})
+					.then(res => {
+						let data = res.data;
+						that.$store.commit("LOGIN", {
+							'token': data.token,
+							'time': data.expires_time - this.$Cache.time()
+						});
+						let backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
+						that.$Cache.clear(BACK_URL);
+						uni.showToast({
+							title: '注册成功'
+						});
+						getUserInfo().then(res => {
+							this.keyLock = true
+							that.$store.commit("SETUID", res.data.uid);
+							that.$store.commit("UPDATE_USERINFO", res.data);
+							if (backUrl.indexOf('/pages/users/login/index') !== -1) {
+								backUrl = '/pages/index/index';
+							}
+							// uni.reLaunch({
+							// 	url: backUrl
+							// });
+						})
+					})
+					.catch(res => {
+						this.keyLock = true
+						that.$util.Tips({
+							title: res
+						});
+					});
+
+
+			},
+			async getCode(data) {
+				console.log('data-------', data);
+				let that = this;
+				if (!that.account) return that.$util.Tips({
+					title: '请填写手机号码'
+				});
+				if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.account)) return that.$util.Tips({
+					title: '请输入正确的手机号码'
+				});
+				await registerVerify({
+						phone: that.account,
+						type: that.type,
+						key: that.keyCode,
+						captchaType: 'blockPuzzle',
+						captchaVerification: data.captchaVerification
+					})
+					.then(res => {
+						that.$util.Tips({
+							title: res.msg
+						});
+						that.sendCode();
+					})
+					.catch(res => {
+						that.$util.Tips({
+							title: res
+						});
+					});
+			},
+			privacy(type) {
+				uni.navigateTo({
+					url: "/pages/users/privacy/index?type=" + type
+				})
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.copyright {
+		width: 650rpx;
+		position: fixed;
+		bottom: 30rpx;
+		left: 50%;
+		margin-left: -325rpx;
+		font-size: 20rpx;
+		color: #999999;
+		text-align: center;
+
+		.domain {
+			color: #478BF1;
+			margin-left: 6rpx;
+		}
+	}
+
+	.itemImg-add {
+		width: 24rpx;
+		height: 34rpx;
+	}
+
+	.item-img {
+		width: 28rpx;
+		height: 32rpx;
+	}
+
+	/deep/uni-checkbox .uni-checkbox-input {
+		margin-top: -6rpx;
+	}
+
+	.appLogin {
+		margin-top: 60rpx;
+
+		.hds {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			font-size: 24rpx;
+			color: #B4B4B4;
+
+			.line {
+				width: 68rpx;
+				height: 1rpx;
+				background: #CCCCCC;
+			}
+
+			p {
+				margin: 0 20rpx;
+			}
+		}
+
+		.btn-wrapper {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			margin-top: 30rpx;
+
+			.btn {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				width: 68rpx;
+				height: 68rpx;
+				border-radius: 50%;
+			}
+
+			.apple-btn {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				width: 246rpx;
+				height: 66rpx;
+				margin-left: 30rpx;
+				background: #EAEAEA;
+				border-radius: 34rpx;
+				font-size: 24rpx;
+
+				.icon-s-pingguo {
+					color: #333;
+					margin-right: 10rpx;
+					font-size: 34rpx;
+				}
+			}
+
+			.iconfont {
+				font-size: 40rpx;
+				color: #fff;
+			}
+
+			.wx {
+				background-color: #61C64F;
+			}
+
+			.mima {
+				background-color: #28B3E9;
+			}
+
+			.yanzheng {
+				background-color: #F89C23;
+			}
+
+			.pingguo {
+				margin-left: 60rpx;
+				background-color: #000;
+			}
+
+		}
+	}
+
+	.main-color {
+		color: var(--view-theme);
+	}
+
+	.code img {
+		width: 100%;
+		height: 100%;
+	}
+
+	.acea-row.row-middle {
+		input {
+			margin-left: 20rpx;
+			display: block;
+		}
+	}
+
+	.login-wrapper {
+		.login-top {
+			height: 358rpx;
+			background-color: var(--view-theme);
+			background-image: url(../static/login.png);
+			background-size: cover;
+			background-repeat: no-repeat;
+
+			image {
+				width: 101%;
+				height: 100%;
+			}
+		}
+
+		.shading {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 100%;
+			margin-top: -230rpx;
+			position: relative;
+			z-index: 8;
+
+			image {
+				width: 180rpx;
+				height: 180rpx;
+				top: 40rpx;
+			}
+		}
+
+		.whiteBg {
+			background-color: #fff;
+			margin: -30rpx 56rpx 0rpx 56rpx;
+			box-shadow: 0px 2px 14px 0px rgba(0, 0, 0, 0.08);
+			border-radius: 8px;
+			padding: 60rpx;
+			position: relative;
+			z-index: 6;
+
+			.tips {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				height: 50rpx;
+				margin: 40rpx;
+				color: #999;
+
+				.tips-btn {
+					margin: 0 31rpx 0 48rpx;
+					color: #999999;
+					font-weight: bold;
+					font-size: 32rpx;
+
+
+					/* Safari 与 Chrome */
+					.line {
+						width: 80rpx;
+						height: 6rpx;
+						background: linear-gradient(135deg, var(--view-minorColor) 0%, var(--view-theme) 100%);
+						border-radius: 2px;
+						margin: 10rpx auto 0 auto;
+						animation: myfirst .3s;
+						-webkit-animation: myfirst .3s;
+					}
+
+					.none {
+						width: 80rpx;
+						background: #fff;
+						height: 6rpx;
+					}
+				}
+
+				@keyframes myfirst {
+					0% {
+						width: 0rpx;
+					}
+
+					100% {
+						width: 80rpx;
+					}
+				}
+
+				@-webkit-keyframes myfirst
+
+				/* Safari 与 Chrome */
+					{
+					0% {
+						width: 0rpx;
+					}
+
+					100% {
+						width: 80rpx;
+					}
+				}
+
+				.tips-btn.on {
+					font-size: 36rpx;
+					color: var(--view-theme);
+				}
+			}
+
+			.list {
+				border-radius: 16rpx;
+				overflow: hidden;
+
+				.forgetPwd {
+					text-align: right;
+					margin-top: 10rpx;
+					color: #666666;
+					font-size: 24rpx;
+				}
+
+				.item {
+					border-bottom: 1px solid #F0F0F0;
+					background: #fff;
+
+					.row-middle {
+						position: relative;
+						padding: 16rpx 25rpx;
+
+						input {
+							flex: 1;
+							font-size: 28rpx;
+							height: 80rpx;
+						}
+
+						.code {
+							position: absolute;
+							right: 30rpx;
+							top: 50%;
+							color: var(--view-theme);
+							font-size: 26rpx;
+							transform: translateY(-50%);
+						}
+					}
+				}
+			}
+
+			.logon {
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				width: 100%;
+				height: 86rpx;
+				margin-top: 48rpx;
+				background: linear-gradient(135deg, var(--view-minorColor) 0%, var(--view-theme) 100%);
+				border-radius: 120rpx;
+				color: #FFFFFF;
+				font-size: 30rpx;
+			}
+		}
+
+		.protocol {
+			margin-top: 40rpx;
+			color: #999999;
+			font-size: 24rpx;
+		}
+
+		.trembling {
+			animation: shake 0.6s;
+		}
+
+		@keyframes shake {
+
+			0%,
+			100% {
+				-webkit-transform: translateX(0);
+			}
+
+			10%,
+			30%,
+			50%,
+			70%,
+			90% {
+				-webkit-transform: translateX(-5rpx);
+			}
+
+			20%,
+			40%,
+			60%,
+			80% {
+				-webkit-transform: translateX(5rpx);
+			}
+		}
+
+		@-o-keyframes shake {
+
+			/* Opera */
+			0%,
+			100% {
+				-webkit-transform: translateX(0);
+			}
+
+			10%,
+			30%,
+			50%,
+			70%,
+			90% {
+				-webkit-transform: translateX(-5rpx);
+			}
+
+			20%,
+			40%,
+			60%,
+			80% {
+				-webkit-transform: translateX(5rpx);
+			}
+		}
+
+		@-webkit-keyframes shake {
+
+			/* Safari 和 Chrome */
+			0%,
+			100% {
+				-webkit-transform: translateX(0);
+			}
+
+			10%,
+			30%,
+			50%,
+			70%,
+			90% {
+				-webkit-transform: translateX(-5rpx);
+			}
+
+			20%,
+			40%,
+			60%,
+			80% {
+				-webkit-transform: translateX(5rpx);
+			}
+		}
+
+		@-moz-keyframes shake {
+
+			/* Firefox */
+			0%,
+			100% {
+				-moz-transform: translateX(0);
+			}
+
+			10%,
+			30%,
+			50%,
+			70%,
+			90% {
+				-moz-transform: translateX(-5rpx);
+			}
+
+			20%,
+			40%,
+			60%,
+			80% {
+				-moz-transform: translateX(5rpx);
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/users/user_spread_code/index.vue

@@ -139,7 +139,7 @@
 		async onReady() {
 			if (this.isLogin) {
 				// #ifdef APP-PLUS
-				this.val = `${HTTP_REQUEST_URL}/pages/users/login/index?spid=${this.uid}`
+				this.val = `${HTTP_REQUEST_URL}/pages/users/login/register?spid=${this.uid}`
 				// #endif
 				// #ifndef APP
 				this.val = `${HTTP_REQUEST_URL}?spid=${this.uid}`