fix:调整登录页样式

This commit is contained in:
2025-10-27 09:17:36 +08:00
parent fba9261840
commit 449c63ecc4
+103 -10
View File
@@ -9,18 +9,28 @@
<view class="subtitle">为保障使用体验请先完成登录</view> <view class="subtitle">为保障使用体验请先完成登录</view>
<!-- 微信一键手机号快捷登录推荐 --> <!-- 微信一键手机号快捷登录推荐 -->
<button class="btn primary" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber"> <button v-if="!isAgreed" class="btn primary" @click="handleLoginClick">
手机号快捷登录
</button>
<button v-else class="btn primary" open-type="getPhoneNumber" @getphonenumber="onGetPhoneNumber">
手机号快捷登录 手机号快捷登录
</button> </button>
<!-- 仅微信登录不授权手机号时使用 --> <!-- 仅微信登录不授权手机号时使用 -->
<!-- <button class="btn outline" @click="onWeChatLogin">仅微信登录</button> --> <!-- <button class="btn outline" @click="onWeChatLogin">仅微信登录</button> -->
<view class="tips"> <view class="agreement-box">
登录即表示同意 <checkbox-group @change="onAgreementChange">
<text class="link" @tap="go('/pages/legal/agreement')">用户协议</text> <label class="agreement-label">
<checkbox value="agreed" :checked="isAgreed" color="#07c160" class="agreement-checkbox" />
<text class="agreement-text">
我已阅读并同意
<text class="link" @tap.stop="go('/pages/legal/agreement')">用户协议</text>
<text class="link" @tap="go('/pages/legal/privacy')">隐私政策</text> <text class="link" @tap.stop="go('/pages/legal/privacy')">隐私政策</text>
</text>
</label>
</checkbox-group>
</view> </view>
</view> </view>
</template> </template>
@@ -31,6 +41,51 @@
import { wxLogin, getUserPhoneNumber, getUserInfo } from '../../util/index.js' import { wxLogin, getUserPhoneNumber, getUserInfo } from '../../util/index.js'
const redirect = ref('/pages/index/index') const redirect = ref('/pages/index/index')
const isAgreed = ref(false) // 是否同意协议
// 勾选协议变化
const onAgreementChange = (e) => {
isAgreed.value = e.detail.value.includes('agreed')
console.log('协议勾选状态:', isAgreed.value, e.detail.value)
}
// 未勾选协议时点击登录按钮
const handleLoginClick = async () => {
try {
await checkAgreement()
// 协议已同意后,按钮会自动切换为带open-type的版本
} catch (error) {
// 用户取消了协议同意
}
}
// 检查是否同意协议
const checkAgreement = () => {
return new Promise((resolve, reject) => {
if (isAgreed.value) {
resolve()
return
}
// 未勾选,弹窗提示
uni.showModal({
title: '温馨提示',
content: '请先阅读并同意《用户协议》和《隐私政策》',
confirmText: '同意',
cancelText: '取消',
success: (res) => {
if (res.confirm) {
// 用户点击同意,自动勾选
isAgreed.value = true
resolve()
} else {
// 用户点击取消
reject(new Error('需要同意协议才能登录'))
}
}
})
})
}
const navigateAfterLogin = async () => { const navigateAfterLogin = async () => {
try { try {
@@ -50,19 +105,25 @@
const onWeChatLogin = async () => { const onWeChatLogin = async () => {
try { try {
// 先检查是否同意协议
await checkAgreement()
await wxLogin() await wxLogin()
uni.showToast({ title: '登录成功', icon: 'success' }) uni.showToast({ title: '登录成功', icon: 'success' })
await navigateAfterLogin() await navigateAfterLogin()
} catch (error) { } catch (error) {
if (error.message !== '需要同意协议才能登录') {
uni.showToast({ title: error.message || '登录失败', icon: 'none' }) uni.showToast({ title: error.message || '登录失败', icon: 'none' })
} }
} }
}
const onGetPhoneNumber = async (e) => { const onGetPhoneNumber = async (e) => {
if (!e || e.detail.errMsg !== 'getPhoneNumber:ok') { if (!e || e.detail.errMsg !== 'getPhoneNumber:ok') {
uni.showToast({ title: '已取消手机号授权', icon: 'none' }) uni.showToast({ title: '已取消手机号授权', icon: 'none' })
return return
} }
try { try {
// 先微信登录,获取 token // 先微信登录,获取 token
await wxLogin() await wxLogin()
@@ -150,11 +211,43 @@
border: 2rpx solid #07c160; border: 2rpx solid #07c160;
} }
.tips { .agreement-box {
margin-top: 24rpx; margin-top: 32rpx;
font-size: 22rpx; display: flex;
color: #999; justify-content: center;
.link { color: #07c160; } align-items: center;
left: 50%;
transform: translateX(-50%);
width: 100%;
bottom: 40rpx;
position: absolute;
.agreement-label {
display: flex;
align-items: center;
width: 100%;
.agreement-checkbox {
flex-shrink: 0;
// margin-right: 12rpx;
// margin-top: 2rpx;
transform:scale(0.7);
}
.agreement-text {
flex: 1;
font-size: 24rpx;
color: #666;
line-height: 1.8;
word-break: break-all;
.link {
color: #07c160;
font-weight: 500;
text-decoration: none;
}
}
}
} }
} }
</style> </style>