Files
banban/banban-mini/src/pages/login/index.tsx
2026-04-22 17:25:03 +08:00

115 lines
3.3 KiB
TypeScript

import { View, Text, Button } from '@tarojs/components'
import { useEffect, useState } from 'react'
import Taro from '@tarojs/taro'
import { getToken, wechatLogin } from '@/services/auth'
import './index.scss'
export default function Login() {
const [submitting, setSubmitting] = useState(false)
useEffect(() => {
if (getToken()) {
Taro.reLaunch({ url: '/pages/device/index' })
}
}, [])
const handleLogin = async () => {
if (submitting) return
setSubmitting(true)
Taro.showLoading({ title: '登录中...' })
try {
const loginRes = await Taro.login()
if (!loginRes.code) {
throw new Error('未获取到微信登录凭证')
}
let userInfo:
| {
nickName?: string
avatarUrl?: string
}
| null = null
try {
const profileRes = await Taro.getUserProfile({
desc: '用于完善家长资料展示',
})
userInfo = profileRes.userInfo || null
} catch (error) {
console.log('[login] getUserProfile skipped:', error)
}
await wechatLogin({
code: loginRes.code,
nickname: userInfo?.nickName,
avatar_url: userInfo?.avatarUrl,
})
if (userInfo) {
Taro.setStorageSync('userInfo', {
nickname: userInfo.nickName,
avatar_url: userInfo.avatarUrl,
})
} else {
Taro.removeStorageSync('userInfo')
}
Taro.showToast({ title: '登录成功', icon: 'success' })
setTimeout(() => {
Taro.reLaunch({ url: '/pages/device/index' })
}, 300)
} catch (error: any) {
console.error('[login] failed:', error)
Taro.showToast({
title: error?.message || '登录失败,请重试',
icon: 'none',
})
} finally {
Taro.hideLoading()
setSubmitting(false)
}
}
return (
<View className='login-page'>
<View className='login-header'>
<View className='logo'>
<Text className='logo-icon'>🤖</Text>
</View>
<Text className='title'></Text>
<Text className='subtitle'></Text>
</View>
<View className='login-content'>
<View className='features'>
<View className='feature-item'>
<Text className='feature-icon'>💬</Text>
<Text className='feature-text'>AI </Text>
</View>
<View className='feature-item'>
<Text className='feature-icon'>📍</Text>
<Text className='feature-text'></Text>
</View>
<View className='feature-item'>
<Text className='feature-icon'>🔋</Text>
<Text className='feature-text'></Text>
</View>
</View>
<View className='login-btn-wrapper'>
<Button className='login-btn' loading={submitting} disabled={submitting} onClick={handleLogin}>
<Text className='btn-icon'>🌐</Text>
<Text className='btn-text'>{submitting ? '登录中...' : '微信一键登录'}</Text>
</Button>
</View>
<Text className='agreement'>
</Text>
</View>
</View>
)
}