1. 会员等级背景图去掉校验 2. 当查询不到会员等级是,按无会员等级展示 3. 删除商城首页冗余配置在index中的引用 4. 换绑推广人时,计算上一个推广人的推广人数 5. pc后台清除推广人时,更新推广人数量 6. 保证砍价金额最小为0.01 7. 修复商品删除时购物车关联删除 8. 删除商品问题修复 9. 运费模板——指定包邮,包邮数量类型修改 10. 签到错误修复 11. 修复我的优惠券只查询20条的问题 12. 文章列表修复 13. 拼团商品详情页数据统计显示问题修复 14. PC后台,账户详情,持有优惠券列表修复 15. 支付查询参数修复 16. 修复过期优惠券可以重复领取 17. 订单邮费切换地址重复计算修复 18. 判断是否在指定包邮区域内 必须满足件数 + 金额 才能包邮 19. 支付页面,切换tab,金额计算问题修复 20. 物流模板新增、编辑——修复 21. 去除线下邮费的影响 22. 订单运费计算重写 23. 下单页面到店自提合计金额不应该计算商品邮费 24. 新人券领取后,部分使用时间为空——修复
622 lines
15 KiB
Vue
622 lines
15 KiB
Vue
<template>
|
|
<div class="login-wrapper">
|
|
<div class="shading">
|
|
<image :src="logoUrl" v-if="logoUrl" />
|
|
<image src="/static/images/logo2.png" v-else />
|
|
</div>
|
|
<div class="whiteBg" v-if="formItem === 1">
|
|
<div class="list" v-if="current !== 1">
|
|
<form @submit.prevent="submit">
|
|
<div class="item">
|
|
<div class="acea-row row-middle">
|
|
<image src="/static/images/phone_1.png" style="width: 24rpx; height: 34rpx;"></image>
|
|
<input type="text" placeholder="输入手机号码" v-model="account" required />
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="acea-row row-middle">
|
|
<image src="/static/images/code_2.png" style="width: 28rpx; height: 32rpx;"></image>
|
|
<input type="password" placeholder="填写登录密码" v-model="password" required />
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
<div class="list" v-if="current !== 0 || appLoginStatus || appleLoginStatus">
|
|
<div class="item">
|
|
<div class="acea-row row-middle">
|
|
<image src="/static/images/phone_1.png" style="width: 24rpx; height: 34rpx;"></image>
|
|
<input type="text" placeholder="输入手机号码" v-model="account" />
|
|
</div>
|
|
</div>
|
|
<div class="item">
|
|
<div class="acea-row row-middle">
|
|
<image src="/static/images/code_2.png" style="width: 28rpx; height: 32rpx;"></image>
|
|
<input type="text" placeholder="填写验证码" class="codeIput" v-model="captcha" />
|
|
<button class="code" :disabled="disabled" :class="disabled === true ? 'on' : ''" @click="code">
|
|
{{ text }}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="item" v-if="isShowCode">
|
|
<div class="acea-row row-middle">
|
|
<image src="/static/images/code_2.png" style="width: 28rpx; height: 32rpx;"></image>
|
|
<input type="text" placeholder="填写验证码" class="codeIput" v-model="codeVal" />
|
|
<div class="code" @click="again"><img :src="codeUrl" /></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="logon" @click="loginMobile" v-if="current !== 0">登录</div>
|
|
<div class="logon" @click="submit" v-if="current === 0">登录</div>
|
|
<!-- #ifndef APP-PLUS -->
|
|
<div class="tips">
|
|
<div v-if="current==0" @click="current = 1">快速登录</div>
|
|
<div v-if="current==1" @click="current = 0">账号登录</div>
|
|
</div>
|
|
<!-- #endif -->
|
|
<!-- #ifdef APP-PLUS -->
|
|
<view class="appLogin" v-if="!appLoginStatus && !appleLoginStatus">
|
|
<view class="hds">
|
|
<span class="line"></span>
|
|
<p>其他方式登录</p>
|
|
<span class="line"></span>
|
|
</view>
|
|
<view class="btn-wrapper">
|
|
<view class="btn wx" @click="wxLogin">
|
|
<span class="iconfont icon-s-weixindenglu1"></span>
|
|
</view>
|
|
<view class="btn mima" v-if="current == 1" @click="current =0">
|
|
<span class="iconfont icon-s-mimadenglu1"></span>
|
|
</view>
|
|
<view class="btn yanzheng" v-if="current == 0" @click="current =1">
|
|
<span class="iconfont icon-s-yanzhengmadenglu1"></span>
|
|
</view>
|
|
<view class="apple-btn" @click="appleLogin" v-if="appleShow">
|
|
<view class="iconfont icon-s-pingguo"></view>通过Apple登录
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<!-- #endif -->
|
|
</div>
|
|
<div class="bottom"></div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import dayjs from "@/plugin/dayjs/dayjs.min.js";
|
|
import sendVerifyCode from "@/mixins/SendVerifyCode";
|
|
import {
|
|
loginH5,
|
|
loginMobile,
|
|
registerVerify,
|
|
register,
|
|
// 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 {
|
|
VUE_APP_API_URL
|
|
} from "@/utils";
|
|
|
|
const BACK_URL = "login_back_url";
|
|
|
|
export default {
|
|
name: "Login",
|
|
mixins: [sendVerifyCode],
|
|
data: function() {
|
|
return {
|
|
navList: ["快速登录", "账号登录"],
|
|
current: 0,
|
|
account: "",
|
|
password: "",
|
|
captcha: "",
|
|
formItem: 1,
|
|
type: "login",
|
|
logoUrl: "",
|
|
keyCode: "",
|
|
codeUrl: "",
|
|
codeVal: "",
|
|
isShowCode: false,
|
|
appLoginStatus: false, // 微信登录强制绑定手机号码状态
|
|
appUserInfo: null, // 微信登录保存的用户信息
|
|
appleLoginStatus: false, // 苹果登录强制绑定手机号码状态
|
|
appleUserInfo: null,
|
|
appleShow: false // 苹果登录版本必须要求ios13以上的
|
|
};
|
|
},
|
|
watch:{
|
|
formItem:function(nval,oVal){
|
|
if(nval == 1){
|
|
this.type = 'login'
|
|
}else{
|
|
this.type = 'register'
|
|
}
|
|
}
|
|
},
|
|
mounted: function() {
|
|
this.getCode();
|
|
this.getLogoImage();
|
|
},
|
|
methods: {
|
|
// 苹果登录
|
|
appleLogin() {
|
|
let self = this
|
|
this.account = ''
|
|
this.captcha = ''
|
|
uni.showLoading({
|
|
title: '登录中'
|
|
})
|
|
uni.login({
|
|
provider: 'apple',
|
|
timeout: 10000,
|
|
success(loginRes) {
|
|
console.log(loginRes, 'loginRes')
|
|
uni.getUserInfo({
|
|
provider: 'apple',
|
|
success: function(infoRes) {
|
|
console.log(infoRes.userInfo, 'yyyy')
|
|
self.appleUserInfo = infoRes.userInfo
|
|
self.appleLoginApi()
|
|
|
|
console.log(self.$store);
|
|
console.log(infoRes.userInfo);
|
|
},
|
|
fail() {
|
|
uni.showToast({
|
|
title: '获取用户信息失败',
|
|
icon: 'none',
|
|
duration: 2000
|
|
})
|
|
},
|
|
complete() {
|
|
uni.hideLoading()
|
|
}
|
|
});
|
|
},
|
|
fail(error) {
|
|
console.log(error)
|
|
}
|
|
})
|
|
},
|
|
// 苹果登录Api
|
|
appleLoginApi() {
|
|
let self = this
|
|
appleLogin({
|
|
openId: self.appleUserInfo.openId,
|
|
email: self.appleUserInfo.email || '',
|
|
phone: this.account,
|
|
captcha: this.captcha
|
|
}).then(({
|
|
data
|
|
}) => {
|
|
if (data.isbind) {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: '请绑定手机号后,继续操作',
|
|
showCancel: false,
|
|
success: function(res) {
|
|
if (res.confirm) {
|
|
self.current = 1
|
|
self.appleLoginStatus = true
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
self.$store.commit("LOGIN", {
|
|
'token': data.token,
|
|
'time': data.expires_time - self.$Cache.time()
|
|
});
|
|
let backUrl = self.$Cache.get(BACK_URL) || "/pages/index/index";
|
|
self.$Cache.clear(BACK_URL);
|
|
self.$store.commit("SETUID", data.userInfo.uid);
|
|
uni.reLaunch({
|
|
url: backUrl
|
|
});
|
|
}
|
|
}).catch(error => {
|
|
uni.showModal({
|
|
title: '提示',
|
|
content: `错误信息${error}`,
|
|
success: function(res) {
|
|
if (res.confirm) {
|
|
console.log('用户点击确定');
|
|
} else if (res.cancel) {
|
|
console.log('用户点击取消');
|
|
}
|
|
}
|
|
});
|
|
})
|
|
},
|
|
// App微信登录
|
|
wxLogin() {
|
|
let self = this
|
|
this.account = ''
|
|
this.captcha = ''
|
|
uni.showLoading({
|
|
title: '登录中'
|
|
})
|
|
uni.login({
|
|
provider: 'weixin',
|
|
success: function(loginRes) {
|
|
// 获取用户信息
|
|
uni.getUserInfo({
|
|
provider: 'weixin',
|
|
success: function(infoRes) {
|
|
console.log(infoRes.userInfo, 'yyyy')
|
|
self.appUserInfo = infoRes.userInfo
|
|
self.wxLoginApi()
|
|
|
|
console.log(self.$store);
|
|
console.log(infoRes.userInfo);
|
|
},
|
|
fail() {
|
|
uni.showToast({
|
|
title: '获取用户信息失败',
|
|
icon: 'none',
|
|
duration: 2000
|
|
})
|
|
},
|
|
complete() {
|
|
uni.hideLoading()
|
|
}
|
|
});
|
|
},
|
|
fail() {
|
|
uni.showToast({
|
|
title: '登录失败',
|
|
icon: 'none',
|
|
duration: 2000
|
|
})
|
|
}
|
|
});
|
|
},
|
|
again() {
|
|
this.codeUrl =
|
|
VUE_APP_API_URL +
|
|
"/sms_captcha?" +
|
|
"key=" +
|
|
this.keyCode +
|
|
Date.parse(new Date());
|
|
},
|
|
getCode() {
|
|
let that = this
|
|
// getCodeApi()
|
|
// .then(res => {
|
|
// that.keyCode = res.data.key;
|
|
// })
|
|
// .catch(res => {
|
|
// that.$util.Tips({
|
|
// title: res
|
|
// });
|
|
// });
|
|
},
|
|
async getLogoImage() {
|
|
let that = this;
|
|
getLogo().then(res => {
|
|
that.logoUrl = res.data.logoUrl;
|
|
});
|
|
},
|
|
async loginMobile() {
|
|
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: '请输入正确的手机号码'
|
|
});
|
|
if (!that.captcha) return that.$util.Tips({
|
|
title: '请填写验证码'
|
|
});
|
|
if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
|
|
title: '请输入正确的验证码'
|
|
});
|
|
loginMobile({
|
|
account: that.account,
|
|
captcha: that.captcha,
|
|
spread: that.$Cache.get("spread")
|
|
})
|
|
.then(res => {
|
|
let data = res.data;
|
|
let newTime = Math.round(new Date() / 1000);
|
|
that.$store.commit("LOGIN", {
|
|
'token': data.token
|
|
// 'time': dayjs(data.expiresTime) - newTime
|
|
});
|
|
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
|
|
that.$Cache.clear(BACK_URL);
|
|
getUserInfo().then(res => {
|
|
that.$store.commit("UPDATE_USERINFO", res.data);
|
|
that.$store.commit("SETUID", res.data.uid);
|
|
if (backUrl === '/pages/index/index' || backUrl === '/pages/order_addcart/order_addcart' || backUrl ===
|
|
'/pages/user/index') {
|
|
|
|
uni.switchTab({
|
|
url: backUrl
|
|
});
|
|
|
|
} else {
|
|
uni.navigateBack()
|
|
// uni.switchTab({
|
|
// url: '/pages/index/index'
|
|
// });
|
|
}
|
|
})
|
|
})
|
|
.catch(res => {
|
|
that.$util.Tips({
|
|
title: res
|
|
});
|
|
});
|
|
},
|
|
async register() {
|
|
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: '请输入正确的手机号码'
|
|
});
|
|
if (!that.captcha) return that.$util.Tips({
|
|
title: '请填写验证码'
|
|
});
|
|
if (!/^[\w\d]+$/i.test(that.captcha)) return that.$util.Tips({
|
|
title: '请输入正确的验证码'
|
|
});
|
|
if (!that.password) return that.$util.Tips({
|
|
title: '请填写密码'
|
|
});
|
|
if (!/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/i.test(that.password)) return that.$util.Tips({
|
|
title: '您输入的密码过于简单'
|
|
});
|
|
register({
|
|
account: that.account,
|
|
captcha: that.captcha,
|
|
password: that.password,
|
|
spread: that.$Cache.get("spread")
|
|
})
|
|
.then(res => {
|
|
that.$util.Tips({
|
|
title: res
|
|
});
|
|
that.formItem = 1;
|
|
})
|
|
.catch(res => {
|
|
that.$util.Tips({
|
|
title: res
|
|
});
|
|
});
|
|
},
|
|
async code() {
|
|
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: '请输入正确的手机号码'
|
|
});
|
|
if (that.formItem == 2) that.type = "register";
|
|
// phone: that.account
|
|
// type: that.type,
|
|
// key: that.keyCode,
|
|
// code: that.codeVal
|
|
await registerVerify(that.account)
|
|
.then(res => {
|
|
that.$util.Tips({title:res.message});
|
|
that.sendCode();
|
|
})
|
|
.catch(res => {
|
|
// if (res.data.status === 402) {
|
|
// that.codeUrl = `${VUE_APP_API_URL}/sms_captcha?key=${that.keyCode}`;
|
|
// that.isShowCode = true;
|
|
// }
|
|
that.$util.Tips({title:res.message});
|
|
});
|
|
},
|
|
navTap: function(index) {
|
|
this.current = index;
|
|
},
|
|
async submit() {
|
|
let that = this;
|
|
if (!that.account) return that.$util.Tips({
|
|
title: '请填写账号'
|
|
});
|
|
if (!/^[\w\d]{5,16}$/i.test(that.account)) return that.$util.Tips({
|
|
title: '请输入正确的账号'
|
|
});
|
|
if (!that.password) return that.$util.Tips({
|
|
title: '请填写密码'
|
|
});
|
|
loginH5({
|
|
account: that.account,
|
|
password: that.password,
|
|
spread: that.$Cache.get("spread")
|
|
})
|
|
.then(({
|
|
data
|
|
}) => {
|
|
// let newTime = Math.round(new Date() / 1000);
|
|
that.$store.commit("LOGIN", {
|
|
'token': data.token
|
|
// 'time': dayjs(data.expiresTime) - newTime
|
|
});
|
|
const backUrl = that.$Cache.get(BACK_URL) || "/pages/index/index";
|
|
that.$Cache.clear(BACK_URL);
|
|
getUserInfo().then(res => {
|
|
that.$store.commit("UPDATE_USERINFO", res.data);
|
|
that.$store.commit("SETUID", res.data.uid);
|
|
if (backUrl === '/pages/index/index' || backUrl === '/pages/order_addcart/order_addcart' || backUrl ==='/pages/user/index') {
|
|
uni.switchTab({
|
|
url: backUrl
|
|
});
|
|
} else {
|
|
uni.switchTab({
|
|
url: '/pages/index/index'
|
|
});
|
|
}
|
|
})
|
|
})
|
|
.catch(e => {
|
|
that.$util.Tips({
|
|
title: e
|
|
});
|
|
});
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.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 {
|
|
margin-right: 30rpx;
|
|
background-color: #61C64F;
|
|
}
|
|
|
|
.mima {
|
|
background-color: #28B3E9;
|
|
}
|
|
|
|
.yanzheng {
|
|
background-color: #F89C23;
|
|
}
|
|
|
|
}
|
|
}
|
|
.code img {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.acea-row.row-middle {
|
|
input {
|
|
margin-left: 20rpx;
|
|
display: block;
|
|
}
|
|
}
|
|
.login-wrapper{
|
|
padding: 30rpx;
|
|
.shading{
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 100%;
|
|
height: 200rpx;
|
|
margin-top: 200rpx;
|
|
image{
|
|
width: 180rpx;
|
|
height: 180rpx;
|
|
}
|
|
}
|
|
.whiteBg{
|
|
margin-top: 100rpx;
|
|
.list{
|
|
border-radius: 16rpx;
|
|
overflow: hidden;
|
|
.item{
|
|
border-bottom: 1px solid #F0F0F0;
|
|
background: #fff;
|
|
.row-middle{
|
|
position: relative;
|
|
padding: 30rpx 45rpx;
|
|
input{
|
|
flex: 1;
|
|
font-size: 28rpx;
|
|
height: 80rpx;
|
|
}
|
|
.code{
|
|
position: absolute;
|
|
right: 30rpx;
|
|
top: 50%;
|
|
color: #E93323;
|
|
font-size: 26rpx;
|
|
transform: translateY(-50%);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.logon{
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 100%;
|
|
height: 86rpx;
|
|
margin-top: 100rpx;
|
|
background-color: $theme-color;
|
|
border-radius: 120rpx;
|
|
color: #FFFFFF;
|
|
font-size: 30rpx;
|
|
}
|
|
.tips{
|
|
margin:30rpx;
|
|
text-align: center;
|
|
color: #999;
|
|
}
|
|
}
|
|
}
|
|
</style>
|