318 lines
7.5 KiB
Vue
Raw Normal View History

2025-04-14 10:57:27 +08:00
<template>
<view class="loginbox">
<view class="logintop">
2025-04-17 15:08:06 +08:00
<image :src="`${imgPath}static/userui/wxloginbj.png`" style="width: 100%; height: 240px;" />
2025-04-14 10:57:27 +08:00
</view>
<view class="loginbotton padding flex flex-direction">
<button v-if="isAgreed.length==0 " class="cu-btn lg bg-green text-white" @click="isAgreedChoose">
<text class="cuIcon-weixin lg" style="font-size: 20px;"></text>
<span style="margin-left: 10px; font-size: 15px;">微信一键登录</span>
</button>
<button v-else-if="phone != null && phone !=''" class="cu-btn lg bg-green text-white" @click="wxlogin">
<text class="cuIcon-weixin lg" style="font-size: 20px;"></text>
<span style="margin-left: 10px; font-size: 15px;">微信一键登录</span>
</button>
<button v-else class="cu-btn lg bg-green text-white" open-type="getPhoneNumber"
@getphonenumber="getPhoneNumber">
<text class="cuIcon-weixin lg" style="font-size: 20px;"></text>
<span style="margin-left: 10px; font-size: 15px;">微信一键登录</span>
</button>
<view class="agreement">
<checkbox-group class="checkbox-group">
<label class="agreement-text flex align-center">
<uni-data-checkbox style="width: 20px;" v-model="isAgreed" multiple :localdata="agreed" />
<span style="color: rgb(173,173,175);">我已经阅读并同意
<text class="terms-link" @click="openTerms">法律条款和隐私政策</text>
</span>
</label>
</checkbox-group>
</view>
</view>
<!-- 手机号登录/注册跳转区域 -->
<view class="phone-login">
<view class="phone-login-text"><span class="phone-login-span"></span> 手机号登录/注册 <span
class="phone-login-span"></span></view>
<view class="phone-login-button">
<view class="iconborder flex justify-center align-center" @click="redirectToPhoneLogin">
2025-04-17 15:08:06 +08:00
<image :src="`${imgPath}static/userui/icon/phone.png`" alt="" />
2025-04-14 10:57:27 +08:00
</view>
</view>
</view>
</view>
<zero-loading v-if="isloading" color="#c1c1c0" type="wobble" mask="true"></zero-loading>
</template>
<script setup>
import {
ref,
onMounted
} from 'vue';
import * as api from '@/utils/api.js';
2025-04-15 11:27:28 +08:00
import config from '@/utils/config';
2025-04-17 15:08:06 +08:00
import {
showModelMessage
} from '@/utils/tools.js';
2025-04-15 11:27:28 +08:00
const imgPath = config.imgPath;
2025-04-14 10:57:27 +08:00
const isAgreed = ref([]); // 用来控制复选框的选中状态
const isloading = ref(false);
const phone = ref("");
const openid = ref("");
const agreed = ref([{
value: true // true 表示选中
}]);
import {
onLoad
} from '@dcloudio/uni-app';
const openTerms = () => {
// 跳转到服务条款页面
uni.navigateTo({
url: '/pages/user/login/terms'
});
};
2025-04-17 15:08:06 +08:00
onMounted(() => {
2025-04-14 10:57:27 +08:00
2025-04-17 15:08:06 +08:00
})
onLoad((options) => {
2025-04-14 10:57:27 +08:00
login();
})
const login = () => {
isloading.value = true;
wx.login({
success: (res) => {
if (res.code) {
api.callOrdereApi("ebikeUser/login?js_code=" + res.code, {}, "get").then(
(wx) => {
if (wx.code == 200) {
api.callOrdereApi("ebikeUser/getInfoByOpenId?openId=" + wx.data, {},
"get")
.then((info) => {
2025-04-18 17:25:14 +08:00
isloading.value = false;
2025-04-14 10:57:27 +08:00
if (info.code == 200) {
openid.value = wx.data;
uni.setStorageSync('wechat_user', info.data);
phone.value = info.data.mobile;
2025-04-17 15:08:06 +08:00
if (!info.data.nickname) {
updateUserProfile();
}
2025-04-14 10:57:27 +08:00
} else {
let params = {
"openid": wx.data,
"status": 1,
}
api.callOrdereApi("ebikeUser/save", params).then(
re => {
if (re.code == 200) {
params.userId = re.data;
uni.setStorageSync('wechat_user',
params);
2025-04-17 15:08:06 +08:00
updateUserProfile();
2025-04-14 10:57:27 +08:00
}
});
}
})
} else {
isloading.value = false;
}
}
);
} else {
console.log('微信登录失败:', res.errMsg);
isloading.value = false;
}
},
fail: (err) => {
console.log('wx.login 调用失败:', err);
isloading.value = false;
},
});
}
2025-04-17 15:08:06 +08:00
// 获取头像和昵称并更新
const updateUserProfile = () => {
wx.getUserInfo({
success: function(res) {
console.log(res.userInfo.nickName); // 昵称
console.log(res.userInfo.avatarUrl); // 头像URL
let wechat_user = uni.getStorageSync('wechat_user');
const params = {
"userId": wechat_user.userId,
"openid": openid.value,
"nickname": res.userInfo.nickName,
"avatar": res.userInfo.avatarUrl
};
api.callOrdereApi("ebikeUser/update", params);
}
});
}
2025-04-14 10:57:27 +08:00
const isAgreedChoose = () => {
// 检查是否同意条款
if (isAgreed.value.length == 0) {
// 弹出提示框,告知用户需要同意条款
uni.showModal({
title: '提示',
content: '请同意并阅读《法律条款和隐私政策》',
success: (res) => {
if (res.confirm) {
// 用户确认同意
isAgreed.value = [true]; // 更新同意状态
}
}
});
}
}
const getPhoneNumber = (e) => {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
// 获取到手机号的加密数据
wx.login({
success: (res) => {
let wechat_user = uni.getStorageSync('wechat_user');
const encryptedData = e.detail.encryptedData;
const iv = e.detail.iv;
const param = {
"jsCode": res.code,
"encryptedData": encryptedData,
"iv": iv
}
api.callOrdereApi("ebikeUser/getEncryptInfo", param).then(info => {
if (info.code == 200) {
//更新手机号
const params = {
"userId": wechat_user.userId,
"openid": openid.value,
"mobile": info.data
}
phone.value = info.data;
api.callOrdereApi("ebikeUser/update", params);
wxlogin();
}
});
},
fail: (err) => {
console.log('wx.login 调用失败:', err);
},
});
} else {
console.log('用户拒绝授权');
return;
}
2025-04-17 15:08:06 +08:00
}
2025-04-14 10:57:27 +08:00
2025-04-17 15:08:06 +08:00
// 判断账号是否已经注销
const isAccountDeactivated = () => {
let wechat_user = uni.getStorageSync('wechat_user');
if (wechat_user && wechat_user.status == -1) {
return false;
}
return true;
2025-04-14 10:57:27 +08:00
}
2025-04-17 15:08:06 +08:00
2025-04-14 10:57:27 +08:00
const wxlogin = () => {
2025-04-17 15:08:06 +08:00
if (!isAccountDeactivated()) {
showModelMessage("您的账户已经注销,请联系管理员!");
} else {
// 调用 wx.login 获取登录凭证 code
isloading.value = true;
setTimeout(() => {
isloading.value = false;
uni.switchTab({
url: "/pages/user/home/home"
})
}, 1000);
}
2025-04-14 10:57:27 +08:00
};
const gotoPhonelogin = () => {
uni.navigateTo({
url: '/pages/user/login/phone_login'
})
}
</script>
<style scoped>
.loginbox {
background-color: #fff;
}
.logintop {
height: 240px;
}
.loginbotton {
margin-top: 40px;
}
.agreement {
margin-top: 20px;
text-align: center;
}
.checkbox-group {
display: flex;
align-items: center;
justify-content: center;
}
.agreement-text {
font-size: 14px;
color: #666;
}
.agreement-text .terms-link {
color: rgb(227, 153, 98);
cursor: pointer;
text-decoration: underline;
}
/* 调整checkbox外观 */
.checkbox {
margin-right: 8px;
}
/* 优化手机号登录/注册部分 */
.phone-login {
margin-top: 220px;
text-align: center;
}
.phone-login-text {
font-size: 12px;
color: #dddddd;
margin-bottom: 10px;
}
.phone-login-span {
color: #e1e1e1;
}
.phone-login-button {
display: flex;
align-items: center;
justify-content: center;
}
.iconborder {
width: 34px;
height: 34px;
border: solid 2px #c5c5c5;
border-radius: 17px;
}
.iconborder image {
width: 20px;
height: 20px;
}
</style>