feat: add guest mode and optimize login experience
针对微信审核要求新增游客浏览模式,用户可无需登录直接浏览应用内容,仅在使用发布、点赞、记录等需要身份的功能时才弹窗引导登录。具体修改包括: 1. 新增游客态判断工具函数与登录守卫逻辑 2. 为登录页添加游客直接进入入口 3. 为首页、酒友圈、个人页、动态页、记录页添加游客适配逻辑 4. 优化登录态失效处理逻辑,不再强制跳转登录页 5. 调整部分页面的返回逻辑适配分享直接进入场景 6. 为各页面添加游客引导UI与交互
This commit is contained in:
+30
-17
@@ -10,19 +10,35 @@ import UniAppWebSocket from './uni-websocket'
|
||||
export const API_HOST = 'https://dev.wash-painting.cn'
|
||||
|
||||
// ==========================================
|
||||
// 401 跳登录页防重锁:token 失效时多个接口会同时返回 401,
|
||||
// 各自 reLaunch 会并发冲突导致 reLaunch:fail timeout,只放行第一次
|
||||
// 登录态工具(微信审核要求:不得在浏览时强制登录)
|
||||
// 游客可直接浏览首页/酒友圈等公开内容,仅在用户主动使用
|
||||
// 记录、发布、点赞等需要身份的功能时,才弹窗由其自行选择是否登录。
|
||||
// ==========================================
|
||||
let authRedirectLock = false
|
||||
function redirectToLogin() {
|
||||
if (authRedirectLock) return
|
||||
authRedirectLock = true
|
||||
setTimeout(() => { authRedirectLock = false }, 3000)
|
||||
const pages = getCurrentPages()
|
||||
const current = pages.length ? pages[pages.length - 1].route : ''
|
||||
// 已在登录页则不重复跳转
|
||||
if (current === 'pages/login/login') return
|
||||
uni.reLaunch({ url: '/pages/login/login', fail: () => {} })
|
||||
|
||||
/** 判断当前是否已登录(本地降级登录也算登录态) */
|
||||
export function isLoggedIn() {
|
||||
return uni.getStorageSync('is_logged_in') === 'true'
|
||||
}
|
||||
|
||||
/**
|
||||
* 需要登录才能使用的功能入口守卫。
|
||||
* 已登录直接放行;未登录弹窗询问,用户可取消继续浏览(不强制)。
|
||||
* @returns {boolean} 是否已登录
|
||||
*/
|
||||
export function requireLogin() {
|
||||
if (isLoggedIn()) return true
|
||||
uni.showModal({
|
||||
title: '登录提示',
|
||||
content: '该功能需要登录后使用,登录后记录可云端同步,是否立即登录?',
|
||||
confirmText: '去登录',
|
||||
cancelText: '再看看',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
uni.navigateTo({ url: '/pages/login/login', fail: () => {} })
|
||||
}
|
||||
}
|
||||
})
|
||||
return false
|
||||
}
|
||||
|
||||
// ==========================================
|
||||
@@ -60,14 +76,11 @@ function httpRequest(url, params) {
|
||||
}
|
||||
resolve(res.data)
|
||||
} else if (code === 401 ) {
|
||||
// token/refresh_token 过期或无效,清除登录态
|
||||
// token/refresh_token 过期或无效:仅静默清除登录态并 reject,
|
||||
// 不强制跳转登录页(游客可继续浏览),后续写操作由 requireLogin 引导
|
||||
uni.removeStorageSync('auth_token')
|
||||
uni.removeStorageSync('refresh_token')
|
||||
uni.removeStorageSync('is_logged_in')
|
||||
if (!silent) {
|
||||
redirectToLogin()
|
||||
uni.showToast({ title: '登录已过期,请重新登录', icon: 'none', duration: 2500 })
|
||||
}
|
||||
reject({ msg: '登录已过期,请重新登录', code })
|
||||
} else {
|
||||
const rawMsg = (res.data && res.data.msg) || (res.data && res.data.errmsg) || '请求失败'
|
||||
|
||||
Reference in New Issue
Block a user