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
|
|||
|
|
}
|