| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- /**
- * 认证工具类
- * 用于管理用户登录状态、token存储和登录检查
- * 使用微信官方最新登录方式:
- * 1. wx.login() 获取code
- * 2. button open-type="chooseAvatar" 获取头像
- * 3. input type="nickname" 获取昵称
- * 4. button open-type="getPhoneNumber" 获取手机号
- */
- import { wxLogin } from './api.js'
- const TOKEN_KEY = 'user_token'
- const USER_INFO_KEY = 'user_info'
- /**
- * 保存用户token到本地存储
- * @param {string} token - 用户登录token
- */
- export const setToken = (token) => {
- uni.setStorageSync(TOKEN_KEY, token)
- }
- /**
- * 获取本地存储的token
- * @returns {string|null} token或null
- */
- export const getToken = () => {
- return uni.getStorageSync(TOKEN_KEY) || null
- }
- /**
- * 移除本地存储的token
- */
- export const removeToken = () => {
- uni.removeStorageSync(TOKEN_KEY)
- }
- /**
- * 保存用户信息到本地存储
- * @param {object} userInfo - 用户信息对象
- */
- export const setUserInfo = (userInfo) => {
- uni.setStorageSync(USER_INFO_KEY, JSON.stringify(userInfo))
- }
- /**
- * 获取本地存储的用户信息
- * @returns {object|null} 用户信息对象或null
- */
- export const getUserInfo = () => {
- const userInfo = uni.getStorageSync(USER_INFO_KEY)
- return userInfo ? JSON.parse(userInfo) : null
- }
- /**
- * 移除本地存储的用户信息
- */
- export const removeUserInfo = () => {
- uni.removeStorageSync(USER_INFO_KEY)
- }
- /**
- * 检查用户是否已登录
- * @returns {boolean} 是否已登录
- */
- export const isLoggedIn = () => {
- return !!getToken()
- }
- /**
- * 清除所有登录信息(退出登录)
- */
- export const logout = () => {
- removeToken()
- removeUserInfo()
- }
- /**
- * 微信静默登录
- * 流程:
- * 1. 用户点击授权手机号按钮
- * 2. 调用 wx.login() 获取 code
- * 3. 获取手机号授权 phoneCode
- * 4. 将 code 和 phoneCode 发送到后端
- * 5. 后端通过 code 获取 openid 和 unionid
- * 6. 后端通过 phoneCode 获取手机号和用户信息(昵称、头像等)
- * 7. 后端保存所有信息到数据库并返回 token
- *
- * @param {string} code - 微信登录code(通过wx.login获取)
- * @param {string} phoneCode - 手机号授权code(通过getPhoneNumber获取)
- * @returns {Promise<boolean>} 登录是否成功
- */
- export const wxAuthLogin = async (code, phoneCode) => {
- try {
- console.log('[微信登录] ========== 开始登录 ==========')
- console.log('[微信登录] 接收到的参数:')
- console.log(' - code:', code)
- console.log(' - phoneCode:', phoneCode)
-
- // 验证必需参数
- if (!code) {
- console.error('[微信登录] 错误:code为空!')
- throw new Error('微信登录code为空,请重试')
- }
-
- if (!phoneCode) {
- console.error('[微信登录] 错误:phoneCode为空!')
- throw new Error('手机号授权code为空,请重试')
- }
-
- // 构建请求参数
- const loginParams = {
- code: code, // 微信登录code,后端用于获取 openid 和 unionid
- phoneCode: phoneCode // 手机号授权code,后端用于获取手机号、昵称、头像等
- }
- console.log('[微信登录] 准备发送到后端的参数:', JSON.stringify(loginParams))
-
- // 调用后端登录接口
- const result = await wxLogin(loginParams)
-
- console.log('[微信登录] 后端响应:', result)
-
- // 保存token和用户信息
- if (result.code === 200 && result.data && result.data.token) {
- setToken(result.data.token)
- if (result.data.userInfo) {
- setUserInfo(result.data.userInfo)
- }
-
- console.log('[微信登录] 登录成功,token已保存')
-
- // 显示成功提示
- uni.showToast({
- title: '登录成功',
- icon: 'success',
- duration: 1500
- })
-
- return true
- } else {
- console.error('[微信登录] 后端返回格式错误:', result)
- throw new Error(result.message || '登录返回数据格式错误')
- }
- } catch (error) {
- console.error('[微信登录] ========== 登录失败 ==========')
- console.error('[微信登录] 错误详情:', error)
-
- uni.showToast({
- title: error.message || '登录失败,请稍后重试',
- icon: 'none',
- duration: 2000
- })
-
- return false
- }
- }
- /**
- * 检查登录状态,未登录则提示用户登录
- * @param {function} callback - 登录成功后的回调函数
- * @returns {boolean} 是否已登录
- */
- export const checkLogin = (callback) => {
- if (isLoggedIn()) {
- return true
- }
-
- // 未登录,提示用户需要登录
- uni.showModal({
- title: '登录提示',
- content: '此功能需要登录后使用,请点击"立即登录"按钮进行授权',
- showCancel: false,
- confirmText: '我知道了'
- })
-
- return false
- }
- /**
- * 显示需要登录的提示(用于页面遮罩层)
- * 返回一个标识,表示是否需要显示登录按钮
- */
- export const needLogin = () => {
- return !isLoggedIn()
- }
|