wx-shop/pages/login/index.vue
2025-11-23 15:21:50 +08:00

264 lines
8.4 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>
<view class="login-page">
<view class="login-container">
<view class="logo-section">
<text class="app-name">香水有毒</text>
<text class="welcome-text">欢迎使用</text>
</view>
<view class="login-form">
<!-- #ifdef MP-WEIXIN -->
<button class="login-btn quick-login-btn" open-type="getPhoneNumber"
@getphonenumber="handleGetPhoneNumber" :loading="loading">
<text class="btn-text">快捷登录</text>
</button>
<!-- #endif -->
<!-- #ifndef MP-WEIXIN -->
<button class="login-btn quick-login-btn" @click="handleQuickLogin" :loading="loading">
<text class="btn-text">快捷登录</text>
</button>
<!-- #endif -->
</view>
<view class="tips-section">
<text class="tips-text">点击快捷登录即表示您同意</text>
<text class="link-text">用户协议</text>
<text class="tips-text"></text>
<text class="link-text">隐私政策</text>
</view>
</view>
</view>
</template>
<script>
import request from '@/api/request.js';
export default {
data() {
return {
loading: false
};
},
methods: {
// 处理获取手机号授权
async handleGetPhoneNumber(e) {
console.log('获取手机号授权结果:', e);
if (e.detail.errMsg === 'getPhoneNumber:ok') {
// 用户同意授权
this.loading = true;
try {
// 先获取微信登录code
const loginRes = await this.wxLogin();
if (!loginRes.code) {
throw new Error('获取微信登录code失败');
}
const open_id = (await request('xcx/basic_login', 'post', {code: loginRes.code})).openid
// 调用登录接口传递code和加密数据
const loginData = {
code: e.detail.code,
invitation_code: '',
openid: open_id
// iv: e.detail.iv
};
const result = await request('xcx/quick_login', 'POST', loginData);
await wx.setStorageSync('access_token', result.token);
await wx.setStorageSync('is_personal_information_complete', result.is_personal_information_complete);
// if (result.is_personal_information_complete) {
wx.navigateBack();
// } else {
// wx.navigateTo({
// url: `/pages/my/editInfo/index`,
// });
// }
// 保存token
// if (result.token) {
// wx.setStorageSync('access_token', result.token);
// } else if (result.data && result.data.token) {
// wx.setStorageSync('access_token', result.data.token);
// }
// // 保存用户信息(如果有)
// if (result.userInfo) {
// wx.setStorageSync('userInfo', result.userInfo);
// } else if (result.data && result.data.userInfo) {
// wx.setStorageSync('userInfo', result.data.userInfo);
// }
uni.showToast({
title: '登录成功',
icon: 'success',
duration: 2000
});
// 登录成功后跳转
// setTimeout(() => {
// // 检查是否有返回路径,否则跳转到首页
// const pages = getCurrentPages();
// if (pages.length > 1) {
// uni.navigateBack();
// } else {
// uni.switchTab({
// url: '/pages/index/index'
// });
// }
// }, 1500);
} catch (error) {
console.error('登录失败:', error);
uni.showToast({
title: error.message || '登录失败,请重试',
icon: 'none',
duration: 2000
});
} finally {
this.loading = false;
}
} else {
// 用户拒绝授权
uni.showToast({
title: '需要授权手机号才能登录',
icon: 'none',
duration: 2000
});
}
},
// 微信登录获取code
wxLogin() {
return new Promise((resolve, reject) => {
// #ifdef MP-WEIXIN
wx.login({
success: (res) => {
if (res.code) {
resolve(res);
} else {
reject(new Error('获取code失败'));
}
},
fail: (err) => {
reject(err);
}
});
// #endif
// #ifndef MP-WEIXIN
// 非微信小程序环境使用uni.login
uni.login({
provider: 'weixin',
success: (res) => {
resolve(res);
},
fail: (err) => {
reject(err);
}
});
// #endif
});
},
// 非微信环境的快捷登录(用于其他平台)
handleQuickLogin() {
uni.showToast({
title: '当前平台不支持快捷登录',
icon: 'none'
});
}
}
};
</script>
<style scoped>
.login-page {
min-height: 100vh;
background: linear-gradient(180deg, #9810fa 0%, #f5f5f5 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 40rpx 32rpx;
}
.login-container {
width: 100%;
max-width: 600rpx;
background: #ffffff;
border-radius: 32rpx;
padding: 80rpx 60rpx;
box-shadow: 0 8rpx 32rpx rgba(152, 16, 250, 0.15);
}
.logo-section {
text-align: center;
margin-bottom: 80rpx;
}
.app-name {
display: block;
font-size: 56rpx;
font-weight: bold;
color: #1A1A1A;
margin-bottom: 16rpx;
}
.welcome-text {
display: block;
font-size: 28rpx;
color: #6a7282;
}
.login-form {
margin-bottom: 60rpx;
}
.login-btn {
width: 100%;
height: 96rpx;
background: linear-gradient(135deg, #9810fa 0%, #7a0bc7 100%);
border-radius: 48rpx;
display: flex;
align-items: center;
justify-content: center;
border: none;
box-shadow: 0 8rpx 24rpx rgba(152, 16, 250, 0.3);
transition: all 0.3s;
}
.login-btn::after {
border: none;
}
.login-btn:active {
transform: scale(0.98);
box-shadow: 0 4rpx 12rpx rgba(152, 16, 250, 0.3);
}
.btn-text {
color: #ffffff;
font-size: 32rpx;
font-weight: 500;
}
.quick-login-btn {
margin-top: 0;
}
.tips-section {
text-align: center;
font-size: 24rpx;
color: #9ca3af;
line-height: 1.6;
}
.tips-text {
color: #9ca3af;
}
.link-text {
color: #9810fa;
margin: 0 4rpx;
}
</style>