问题:全新运行(无登录态)时,列表页的登录门槛会把人弹到登录页, 本地开发每次都要手动输手机号,体验差。 改法:requireLogin 在开发模式下无登录态时静默用首个测试手机号假登录, 直接进业务页,不跳登录页;正式流程不变(公众号入口已透明登录, 登录页仅在外链冷启动等无身份场景出现)。 顺手修掉 redirect 参数的双重编码(URL 里难看的 %252F)。 已实测:清空登录态直接打开列表页,URL 停留在 scenic,列表正常渲染。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
// xuchao: 登录层 —— 登录逻辑全部隔离在这里
|
|
// 一期为假登录(开发模式),后端微信登录接口就绪后只改本文件:
|
|
// - loginByMock 开发模式:输入测试手机号直接登录
|
|
// - loginByWechat 正式流程:用微信网页授权凭证(code)换用户信息
|
|
// - bindPhoneBySms 正式流程:短信验证码绑定手机号(微信授权拿不到手机号时用)
|
|
import config from '@/common/config.js'
|
|
|
|
// 是否已登录(本地缓存里有手机号即视为已登录)
|
|
const isLogin = () => {
|
|
return !!uni.getStorageSync('phone')
|
|
}
|
|
|
|
// xuchao: 登录校验
|
|
// - 开发模式:无登录态时静默用首个测试手机号假登录,不跳登录页(本地直接进业务页)
|
|
// - 正式流程:跳登录页;登录成功后回跳 redirect 指定的页面
|
|
const requireLogin = (redirect) => {
|
|
if (isLogin()) return true
|
|
if (config.devMode) {
|
|
loginByMock(config.testPhones[0])
|
|
return true
|
|
}
|
|
uni.navigateTo({
|
|
url: '/pages/index/authorization' + (redirect ? '?redirect=' + redirect : '')
|
|
})
|
|
return false
|
|
}
|
|
|
|
// xuchao: 开发模式假登录 —— 写入与真实登录相同的缓存数据,后续页面逻辑完全一致
|
|
const loginByMock = (phone) => {
|
|
uni.setStorageSync('phone', phone)
|
|
uni.setStorageSync('openId', 'mock_openid_' + phone)
|
|
uni.setStorageSync('userId', '')
|
|
}
|
|
|
|
// xuchao: 正式流程占位 —— 后端接口就绪后实现(用 code 换 openId + 用户信息)
|
|
const loginByWechat = (code) => {
|
|
return new Promise((resolve, reject) => {
|
|
// TODO 后端就绪后替换为:POST /auth/oauth2session {code} → {openId, mobile, token}
|
|
reject(new Error('微信登录接口未接入'))
|
|
})
|
|
}
|
|
|
|
// xuchao: 正式流程占位 —— 短信验证码绑定手机号
|
|
const bindPhoneBySms = (phone, smsCode) => {
|
|
return new Promise((resolve, reject) => {
|
|
// TODO 后端就绪后替换为:短信验证码校验 + 手机号绑定 openId
|
|
reject(new Error('短信绑定接口未接入'))
|
|
})
|
|
}
|
|
|
|
// 退出登录
|
|
const logout = () => {
|
|
uni.removeStorageSync('phone')
|
|
uni.removeStorageSync('openId')
|
|
uni.removeStorageSync('userId')
|
|
uni.removeStorageSync('token')
|
|
}
|
|
|
|
export default {
|
|
isLogin,
|
|
requireLogin,
|
|
loginByMock,
|
|
loginByWechat,
|
|
bindPhoneBySms,
|
|
logout,
|
|
devMode: config.devMode
|
|
}
|