diff --git a/mini-program/src/pages/login/index.vue b/mini-program/src/pages/login/index.vue
index 302d728..7827fef 100644
--- a/mini-program/src/pages/login/index.vue
+++ b/mini-program/src/pages/login/index.vue
@@ -20,6 +20,22 @@
开启你的数字生命档案
+
+ 微
+ 微信登录中...
+ 微信一键登录
+
+
+
+
+ 或使用手机号登录
+
+
+
手机号码
@@ -94,6 +110,7 @@ onMounted(() => {
const phone = ref('')
const code = ref('')
const loading = ref(false)
+const activeMethod = ref('')
const countdown = ref(60)
const isCountingDown = ref(false)
@@ -132,20 +149,60 @@ const startCountdown = () => {
}, 1000)
}
+const routeAfterLogin = () => {
+ uni.redirectTo({ url: '/pages/main/index?tab=script' })
+}
+
+const getWechatLoginCode = () => {
+ return new Promise((resolve, reject) => {
+ uni.login({
+ provider: 'weixin',
+ success: (res) => {
+ if (res.code) {
+ resolve(res.code)
+ } else {
+ reject(new Error('未获取到微信登录凭证'))
+ }
+ },
+ fail: reject
+ })
+ })
+}
+
+const handleWechatLogin = async () => {
+ if (loading.value) return
+
+ loading.value = true
+ activeMethod.value = 'wechat'
+
+ try {
+ const loginCode = await getWechatLoginCode()
+ const result = await store.loginWithWechat({ code: loginCode })
+
+ if (result.success) {
+ routeAfterLogin()
+ } else {
+ uni.showToast({ title: result.error || '微信登录失败', icon: 'none' })
+ }
+ } catch (error) {
+ uni.showToast({ title: error.message || '微信登录失败', icon: 'none' })
+ } finally {
+ loading.value = false
+ activeMethod.value = ''
+ }
+}
+
const handleLogin = async () => {
if (!canSubmit.value || loading.value) return
loading.value = true
+ activeMethod.value = 'phone'
try {
const result = await store.login(phone.value, code.value)
if (result.success) {
- if (result.hasProfile) {
- uni.redirectTo({ url: '/pages/main/index?tab=script' })
- } else {
- uni.redirectTo({ url: '/pages/onboarding/index' })
- }
+ routeAfterLogin()
} else {
uni.showToast({ title: result.error || '登录失败', icon: 'none' })
}
@@ -153,6 +210,7 @@ const handleLogin = async () => {
uni.showToast({ title: '登录失败', icon: 'none' })
} finally {
loading.value = false
+ activeMethod.value = ''
}
}
@@ -299,6 +357,48 @@ const handleLogin = async () => {
margin-bottom: 36rpx;
}
+.wechat-login-btn {
+ gap: 16rpx;
+ margin-bottom: 26rpx;
+ background: linear-gradient(135deg, #35c76f 0%, #159552 100%);
+ box-shadow:
+ 0 14rpx 36rpx rgba(21, 149, 82, 0.26),
+ inset 0 1rpx 0 rgba(255, 255, 255, 0.22);
+}
+
+.wechat-mark {
+ width: 42rpx;
+ height: 42rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #159552;
+ font-size: 24rpx;
+ line-height: 42rpx;
+ font-weight: 900;
+ background: rgba(255, 255, 255, 0.94);
+}
+
+.login-divider {
+ display: flex;
+ align-items: center;
+ gap: 18rpx;
+ margin-bottom: 30rpx;
+}
+
+.login-divider view {
+ flex: 1;
+ height: 1rpx;
+ background: rgba(224, 205, 255, 0.16);
+}
+
+.login-divider text {
+ color: rgba(225, 209, 255, 0.48);
+ font-size: 22rpx;
+ line-height: 1;
+}
+
.input-group {
margin-bottom: 24rpx;
}