270 lines
5.8 KiB
JavaScript
270 lines
5.8 KiB
JavaScript
/**
|
||
* 用户认证工具模块
|
||
* 统一管理登录状态检查、登录跳转等
|
||
*/
|
||
|
||
/**
|
||
* 检查用户是否已登录
|
||
* @returns {Boolean} 是否已登录
|
||
*/
|
||
function isLoggedIn() {
|
||
const userId = wx.getStorageSync('userId')
|
||
const token = wx.getStorageSync('token')
|
||
return !!(userId && token)
|
||
}
|
||
|
||
/**
|
||
* 获取用户信息
|
||
* @returns {Object|null} 用户信息对象或null
|
||
*/
|
||
function getUserInfo() {
|
||
if (!isLoggedIn()) {
|
||
return null
|
||
}
|
||
|
||
const userInfo = wx.getStorageSync('userInfo')
|
||
return userInfo || null
|
||
}
|
||
|
||
/**
|
||
* 获取用户ID
|
||
* @returns {String|null} 用户ID或null
|
||
*/
|
||
function getUserId() {
|
||
return wx.getStorageSync('userId') || null
|
||
}
|
||
|
||
/**
|
||
* 获取Token
|
||
* @returns {String|null} Token或null
|
||
*/
|
||
function getToken() {
|
||
return wx.getStorageSync('token') || null
|
||
}
|
||
|
||
/**
|
||
* 检查登录状态,未登录则跳转登录页
|
||
* @param {Object} options 配置项
|
||
* @param {String} options.returnUrl 登录成功后返回的页面URL
|
||
* @param {String} options.returnType 返回类型: navigateTo/redirectTo/switchTab
|
||
* @param {Function} options.success 已登录时的回调
|
||
* @param {Function} options.fail 未登录时的回调
|
||
* @returns {Boolean} 是否已登录
|
||
*/
|
||
function checkLogin(options = {}) {
|
||
const {
|
||
returnUrl = '',
|
||
returnType = 'navigateTo',
|
||
success,
|
||
fail
|
||
} = options
|
||
|
||
if (isLoggedIn()) {
|
||
// 已登录
|
||
success && success()
|
||
return true
|
||
} else {
|
||
// 未登录,跳转登录页
|
||
fail && fail()
|
||
|
||
// 保存返回信息
|
||
if (returnUrl) {
|
||
wx.setStorageSync('returnTo', {
|
||
url: returnUrl,
|
||
type: returnType
|
||
})
|
||
}
|
||
|
||
wx.navigateTo({
|
||
url: '/pages/login/login'
|
||
})
|
||
|
||
return false
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 要求登录后执行操作
|
||
* @param {Function} callback 登录后执行的回调
|
||
* @param {Object} options 配置项
|
||
*/
|
||
function requireLogin(callback, options = {}) {
|
||
return checkLogin({
|
||
...options,
|
||
success: callback,
|
||
fail: () => {
|
||
wx.showToast({
|
||
title: '请先登录',
|
||
icon: 'none',
|
||
duration: 2000
|
||
})
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 保存用户信息到本地
|
||
* @param {Object} data 用户数据
|
||
* @param {String} data.userId 用户ID
|
||
* @param {String} data.token Token
|
||
* @param {Object} data.userInfo 用户信息
|
||
*/
|
||
function saveUserData(data) {
|
||
const { userId, token, userInfo } = data
|
||
|
||
if (userId) {
|
||
wx.setStorageSync('userId', userId)
|
||
}
|
||
|
||
if (token) {
|
||
wx.setStorageSync('token', token)
|
||
}
|
||
|
||
if (userInfo) {
|
||
wx.setStorageSync('userInfo', userInfo)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 清除用户登录信息
|
||
*/
|
||
function clearUserData() {
|
||
wx.removeStorageSync('userId')
|
||
wx.removeStorageSync('token')
|
||
wx.removeStorageSync('userInfo')
|
||
}
|
||
|
||
/**
|
||
* 跳转到登录页面(带返回功能)
|
||
* 参考 checkin.js 的实现,显示弹窗确认后跳转登录页
|
||
* @param {Object} options 配置项
|
||
* @param {String} options.message 提示信息
|
||
* @param {String} options.returnUrl 登录成功后返回的页面URL(不传则自动获取当前页面)
|
||
* @param {String} options.returnType 返回类型: navigateTo/redirectTo/switchTab
|
||
* @param {Boolean} options.showCancel 是否显示取消按钮
|
||
* @param {Function} options.onCancel 取消回调
|
||
*/
|
||
function navigateToLogin(options = {}) {
|
||
const {
|
||
message = '请先登录',
|
||
returnUrl = '',
|
||
returnType = 'navigateTo',
|
||
showCancel = true,
|
||
onCancel = null
|
||
} = options
|
||
|
||
// 自动获取当前页面路径
|
||
let finalReturnUrl = returnUrl
|
||
if (!finalReturnUrl) {
|
||
const pages = getCurrentPages()
|
||
if (pages.length > 0) {
|
||
const currentPage = pages[pages.length - 1]
|
||
finalReturnUrl = '/' + currentPage.route
|
||
// 添加页面参数
|
||
if (currentPage.options && Object.keys(currentPage.options).length > 0) {
|
||
const params = Object.keys(currentPage.options)
|
||
.map(key => `${key}=${currentPage.options[key]}`)
|
||
.join('&')
|
||
finalReturnUrl += '?' + params
|
||
}
|
||
}
|
||
}
|
||
|
||
wx.showModal({
|
||
title: '提示',
|
||
content: message,
|
||
confirmText: '去登录',
|
||
cancelText: '返回',
|
||
showCancel: showCancel,
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
// 保存返回信息,登录成功后返回当前页面
|
||
if (finalReturnUrl) {
|
||
wx.setStorageSync('returnTo', {
|
||
type: returnType,
|
||
url: finalReturnUrl
|
||
})
|
||
}
|
||
wx.redirectTo({
|
||
url: '/pages/login/login'
|
||
})
|
||
} else {
|
||
// 点击取消
|
||
if (onCancel) {
|
||
onCancel()
|
||
}
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 退出登录
|
||
* @param {Object} options 配置项
|
||
* @param {String} options.redirectUrl 退出后跳转的页面
|
||
* @param {Boolean} options.confirm 是否需要确认
|
||
* @param {Function} options.success 成功回调
|
||
*/
|
||
function logout(options = {}) {
|
||
const {
|
||
redirectUrl = '/pages/home/home',
|
||
confirm = true,
|
||
success
|
||
} = options
|
||
|
||
const doLogout = () => {
|
||
clearUserData()
|
||
|
||
wx.showToast({
|
||
title: '已退出登录',
|
||
icon: 'success',
|
||
duration: 1500
|
||
})
|
||
|
||
setTimeout(() => {
|
||
success && success()
|
||
|
||
// 跳转到指定页面
|
||
if (redirectUrl.startsWith('/pages/home/') ||
|
||
redirectUrl.startsWith('/pages/index/') ||
|
||
redirectUrl.startsWith('/pages/record/') ||
|
||
redirectUrl.startsWith('/pages/settings/')) {
|
||
wx.reLaunch({
|
||
url: redirectUrl
|
||
})
|
||
} else {
|
||
wx.redirectTo({
|
||
url: redirectUrl
|
||
})
|
||
}
|
||
}, 1500)
|
||
}
|
||
|
||
if (confirm) {
|
||
wx.showModal({
|
||
title: '退出登录',
|
||
content: '确定要退出登录吗?',
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
doLogout()
|
||
}
|
||
}
|
||
})
|
||
} else {
|
||
doLogout()
|
||
}
|
||
}
|
||
|
||
module.exports = {
|
||
isLoggedIn,
|
||
getUserInfo,
|
||
getUserId,
|
||
getToken,
|
||
checkLogin,
|
||
requireLogin,
|
||
navigateToLogin,
|
||
saveUserData,
|
||
clearUserData,
|
||
logout
|
||
}
|