Files
xingmeng-uniapp/pages/users/login/index.vue
PC-202306242200\Administrator c7cbc11d07 first commit
2026-03-28 23:07:10 +08:00

732 lines
18 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>
<div class="login-wrapper">
<div
class="shading"
:style="{
marginTop: current == 1 ? '100rpx' : '200rpx'
}"
>
<view>星梦供应链</view>
</div>
<div class="whiteBg" v-if="formItem === 1">
<div class="list" v-if="current === 0">
<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" class="texts" placeholder="请输入用户名" v-model="formData.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" class="texts" placeholder="请输入密码" v-model="formData.password" required />
</div>
</div>
</form>
<view style="display: flex; align-items: center; justify-content: space-between; color: #e93323; opacity: 0.7">
<view @click="currentChange(3)">找回账号</view>
<view @click="currentChange(2)">忘记密码立即找回</view>
</view>
</div>
<div class="list" v-if="current === 1">
<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" class="texts" placeholder="请输入用户名" v-model="formData.account" />
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png" style="width: 24rpx; height: 34rpx"></image>
<input type="password" class="texts" placeholder="请输入密码" v-model="formData.passwd" />
</div>
</div>
<div class="item">
<div class="acea-row row-middle">
<image src="/static/images/code_2.png" style="width: 24rpx; height: 34rpx"></image>
<input type="password" class="texts" placeholder="请确认密码" v-model="passwdss" />
</div>
</div>
<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" class="texts" placeholder="请输入邀请码" v-model="formData.shareCode" />
</div>
</div>
<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" class="texts" placeholder="请输入手机号" v-model="formData.phone" />
</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="texts" v-model="formData.captcha" />
<button class="code" :class="disabled === true ? 'on' : ''" @click="code">
{{ text }}
</button>
</div>
</div>
</div>
<!-- 忘记密码 -->
<div class="list" v-if="current === 2">
<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" class="texts" placeholder="请输入用户名" v-model="formData.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" class="texts" placeholder="请输入新密码" v-model="formData.passwd" required />
</div>
</div>
<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" class="texts" placeholder="请输入手机号" v-model="formData.phone" />
</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="texts" v-model="formData.captcha" />
<button class="code" :class="disabled === true ? 'on' : ''" @click="code">
{{ text }}
</button>
</div>
</div>
</div>
<!-- 找回账号 -->
<div class="list" v-if="current === 3">
<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" class="texts" placeholder="请输入手机号" v-model="formData.phone" />
</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="texts" v-model="formData.captcha" />
<button class="code" :class="disabled === true ? 'on' : ''" @click="code">
{{ text }}
</button>
</div>
</div>
</div>
<div class="logon" @click="submit" v-if="current === 0">登录</div>
<div class="logon" style="opacity: 0.7; margin-top: 50rpx" @click="currentChange(1)" v-if="current === 0">立即注册</div>
<div class="logon" @click="loginMobile" v-if="current === 1">注册</div>
<div class="logon" style="opacity: 0.7; margin-top: 50rpx" @click="currentChange(0)" v-if="current === 1">立即登录</div>
<div class="logon" @click="wangPass" v-if="current === 2">确认</div>
<div class="logon" @click="zhaoUser" v-if="current === 3">立即找回</div>
<div class="logon" style="opacity: 0.7; margin-top: 50rpx" @click="currentChange(0)" v-if="current === 2 || current === 3">前往登录</div>
</div>
<div class="bottom"></div>
</div>
</template>
<script>
import dayjs from '@/plugin/dayjs/dayjs.min.js';
import sendVerifyCode from '@/mixins/SendVerifyCode';
import {
loginH5,
registerVerify,
register,
// getCodeApi,
getUserInfo,
saveOpenIdByWxCode,
forgotPassword,
forgotUserName
} from '@/api/user';
import attrs, { required, alpha_num, chs_phone } from '@/utils/validate';
import { validatorDefaultCatch } from '@/utils/dialog';
import { getLogo, appAuth, appleLogin } from '@/api/public';
import { VUE_APP_API_URL } from '@/utils';
import { registerMobile } from '@/api/api';
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,
platform: '',
appLoginStatus: false, // 微信登录强制绑定手机号码状态
appUserInfo: null, // 微信登录保存的用户信息
appleLoginStatus: false, // 苹果登录强制绑定手机号码状态
appleUserInfo: null,
appleShow: false, // 苹果登录版本必须要求ios13以上的
passwdss: '',
formData: {
account: '',
captcha: '',
passwd: '',
phone: '',
shareCode: ''
},
shareCode: ''
};
},
watch: {
formItem: function (nval, oVal) {
if (nval == 1) {
this.type = 'login';
} else {
this.type = 'register';
}
}
},
mounted: function () {
this.getCode();
this.getLogoImage();
},
onLoad() {
const invite_code = uni.getStorageSync('user_shareCode');
if (invite_code) {
this.formData.shareCode = invite_code;
this.shareCode = invite_code;
}
let self = this;
uni.getSystemInfo({
success: function (res) {
if (res.platform.toLowerCase() == 'ios' && res.system.split(' ')[1] >= 13) {
self.appleShow = true;
}
}
});
},
methods: {
currentChange(e) {
this.current = e;
switch (e) {
case 0:
this.formData = {
account: '',
password: ''
};
break;
case 1:
this.formData = {
account: '',
captcha: '',
passwd: '',
phone: '',
shareCode: this.shareCode
};
break;
case 2:
this.formData = {
account: '',
passwd: '',
phone: '',
captcha: ''
};
break;
case 3:
this.formData = {
phone: '',
captcha: ''
};
break;
}
},
wxLoginGo(userInfo) {
appAuth(userInfo)
.then((res) => {
if (res.data.type === 'register') {
uni.navigateTo({
url: '/pages/users/app_login/index?authKey=' + res.data.key
});
}
if (res.data.type === 'login') {
this.$store.commit('LOGIN', {
token: res.data.token
});
this.getUserInfo(res.data);
}
})
.catch((res) => {
that.$util.Tips({
title: res
});
});
},
again() {
this.codeUrl = VUE_APP_API_URL + '/sms_captcha?' + 'key=' + this.keyCode + Date.parse(new Date());
},
getCode() {
let that = this;
},
async getLogoImage() {
let that = this;
getLogo().then((res) => {
that.logoUrl = res.data.logoUrl ? res.data.logoUrl : '/static/images/live-logo.gif';
});
},
wangPass() {
let that = this;
if (!that.formData.account)
return that.$util.Tips({
title: '请填写用户名'
});
if (!that.formData.passwd)
return that.$util.Tips({
title: '请填写密码'
});
if (!that.formData.phone)
return that.$util.Tips({
title: '请填写手机号'
});
if (!that.formData.captcha)
return that.$util.Tips({
title: '请填写验证码'
});
forgotPassword(that.formData).then((res) => {
uni.showModal({
title: '提示',
content: '密码已修改',
showCancel: false,
confirmText: '确认',
success: () => {
this.current = 0;
}
});
});
},
zhaoUser() {
let that = this;
if (!that.formData.phone)
return that.$util.Tips({
title: '请填写手机号'
});
if (!that.formData.captcha)
return that.$util.Tips({
title: '请填写验证码'
});
forgotUserName(that.formData).then((res) => {
uni.showModal({
title: '已找回的用户名',
content: res.data.userNames.join(','),
showCancel: false,
confirmText: '确认',
success: () => {
uni.setClipboardData({
data: res.data.userNames.join(','), //要被复制的内容
success: () => {
//复制成功的回调函数
uni.showToast({
//提示
title: '已复制用户名'
});
this.current = 0;
}
});
}
});
});
},
async loginMobile() {
let that = this;
if (!that.formData.account)
return that.$util.Tips({
title: '请填写用户名'
});
if (!that.formData.passwd)
return that.$util.Tips({
title: '请填写密码'
});
if (that.formData.passwd != that.passwdss)
return that.$util.Tips({
title: '两次密码输入不一致'
});
if (!that.formData.shareCode)
return that.$util.Tips({
title: '请填写邀请码'
});
if (!that.formData.phone)
return that.$util.Tips({
title: '请填写手机号'
});
if (!that.formData.captcha)
return that.$util.Tips({
title: '请填写验证码'
});
registerMobile(that.formData)
.then((res) => {
that.$util.Tips({
title: '注册成功'
});
that.current = 0;
that.formData.passwd = '';
that.formData.shareCode = '';
that.formData.phone = '';
that.formData.captcha = '';
that.passwdss = '';
})
.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.formData.phone)
return that.$util.Tips({
title: '请填写手机号码'
});
if (!/^1(3|4|5|7|8|9|6)\d{9}$/i.test(that.formData.phone))
return that.$util.Tips({
title: '请输入正确的手机号码'
});
if (that.formItem == 2) that.type = 'register';
await registerVerify(that.formData.phone)
.then((res) => {
that.$util.Tips({ title: res.message });
that.sendCode();
})
.catch((err) => {
return that.$util.Tips({
title: err
});
});
},
navTap: function (index) {
this.current = index;
},
async submit() {
// let data = {
// code: '000000',
// msg: '操作成功',
// resp_time: '20241129145034',
// resp_data: {
// merchant_no: '8225850553300UN',
// channel_id: '95',
// out_order_no: '202411291106',
// order_create_time: '20241129145034',
// order_efficient_time: '20241201145034',
// pay_order_no: '24112911012001101011279773541',
// total_amount: '1',
// counter_url:
// 'https://pay.lakala.com/r/0000?pageStyle%3DV2%26token%3DCCSSDVvTh2uC7cMMVJLYg8gRw4thq1rVOYD88VZKXYGDvWebqiJgVEsQHIEwDgwQBLDF1zGzjQan-8nuhQ%3D%3D%26amount%3D1%26payOrderNo%3D24112911012001101011279773541%26mndf%3D1'
// }
// };
// wx.openEmbeddedMiniProgram({
// appId: 'wx889424d565967811',
// path: `payment-cashier/pages/checkout/index?source=WECHATMINI&counterUrl=${encodeURIComponent(data.resp_data.counter_url)}`,
// envVersion: 'release',
// // release: 正式版 trial: 体验版
// success(res) {
// // 打开成功
// }
// });
// return;
let that = this;
if (!that.formData.account)
return that.$util.Tips({
title: '请填写账号'
});
if (!that.formData.password)
return that.$util.Tips({
title: '请填写密码'
});
loginH5({
account: that.formData.account,
password: that.formData.password,
spread: that.$Cache.get('spread')
})
.then(({ data }) => {
this.$store.commit('LOGIN', {
token: data.token
});
// that.getUserInfo(data);
uni.login({
success({ code }) {
saveOpenIdByWxCode({ loginCode: code }).then((res) => {
that.getUserInfo(data);
});
}
});
})
.catch((e) => {
that.$util.Tips({
title: e
});
});
},
getUserInfo(data) {
this.$store.commit('SETUID', data.uid);
getUserInfo().then((res) => {
this.$store.commit('UPDATE_USERINFO', res.data);
let backUrl = this.$Cache.get(BACK_URL) || '/pages/index/index';
if (backUrl.indexOf('/pages/users/login/index') !== -1) {
backUrl = '/pages/index/index';
}
uni.reLaunch({
url: '/pages/index/index'
});
return;
console.log(69999);
console.log(backUrl);
uni.reLaunch({
url: backUrl
});
});
}
}
};
</script>
<style lang="scss" scoped>
page {
background: #fff;
}
.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;
margin-left: 30rpx;
background: #000;
border-radius: 34rpx;
font-size: 40rpx;
.icon-s-pingguo {
color: #fff;
font-size: 40rpx;
}
}
.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 {
// flex: 1;
// margin-left: 20rpx;
// }
}
.login-wrapper {
padding: 30rpx;
.shading {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
/* #ifdef APP-VUE */
margin-top: 50rpx;
/* #endif */
/* #ifndef APP-VUE */
margin-top: 200rpx;
/* #endif */
view {
font-size: 38rpx;
font-weight: bold;
}
image {
width: 180rpx;
height: 180rpx;
border-radius: 10rpx;
}
}
.whiteBg {
margin-top: 100rpx;
.list {
border-radius: 16rpx;
overflow: hidden;
.item {
border-bottom: 1px solid #f0f0f0;
background: #fff;
.row-middle {
position: relative;
padding: 16rpx 45rpx;
.texts {
// flex: 1;
margin-left: 20rpx;
font-size: 28rpx;
height: 80rpx;
// line-height: 80rpx;
// display: flex;
// justify-content: center;
// align-items: center;
}
// input {
// flex: 1;
// font-size: 28rpx;
// height: 80rpx;
// line-height: 80rpx;
// }
.code {
position: absolute;
right: 30rpx;
top: 50%;
color: $theme-color;
font-size: 26rpx;
transform: translateY(-50%);
}
}
}
}
.logon {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 86rpx;
margin-top: 80rpx;
background-color: $theme-color;
border-radius: 120rpx;
color: #ffffff;
font-size: 30rpx;
}
.tips {
margin: 30rpx;
text-align: center;
color: #999;
}
}
}
</style>