feat: 支持游客免登录浏览核心页面
未登录用户可先浏览衣橱、穿搭、运势、分享等内容,登录改为用户主动选择,并在登录页增加协议勾选确认与暂不登录入口。
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
import { request, uploadFile, redirectToLogin } from '../../utils/request'
|
||||
import { request, uploadFile } from '../../utils/request'
|
||||
import * as auth from '../../utils/auth'
|
||||
import { UserInfo, QuotaItem } from '../../types/models'
|
||||
import { QuotaType, QUOTA_NAMES, VIP_TYPE_NAMES, STORAGE_KEYS } from '../../utils/config'
|
||||
import { formatDate } from '../../utils/format'
|
||||
import { setTabBarSelected, setTabBarUnread, setTabBarHidden } from '../../utils/tabbar'
|
||||
import { navScroll } from '../../utils/nav'
|
||||
import { goLogin } from '../../utils/guest'
|
||||
import { logger } from '../../utils/logger'
|
||||
|
||||
// 日志模块名
|
||||
@@ -51,6 +52,8 @@ Page({
|
||||
quotaStats: [] as Array<{ key: number; label: string; remain: number; total: number }>,
|
||||
// 滚动收缩:由 utils/nav.ts 的共享 handler 驱动
|
||||
navScrolled: false,
|
||||
// 游客态(未登录):展示资料引导卡,只读入口仍可访问,不发请求
|
||||
guest: false,
|
||||
},
|
||||
|
||||
// scroll-view 滚动 → 导航收缩为玻璃小标题
|
||||
@@ -58,6 +61,11 @@ Page({
|
||||
|
||||
onLoad() {
|
||||
this.setToday()
|
||||
// 首帧渲染前判定游客态,避免首帧 setData 冲突
|
||||
if (!auth.isLoggedIn()) {
|
||||
this.setData({ guest: true })
|
||||
logger.info(LOG, '未登录进入我的页,渲染游客态资料卡')
|
||||
}
|
||||
},
|
||||
|
||||
// 跨零点后回到本页时,生日选择器上限需重算,不能停留在昨天
|
||||
@@ -72,17 +80,46 @@ Page({
|
||||
this.setToday()
|
||||
// 回到本页时按抽屉状态校准标签栏,防止切前后台/切 tab 后残留隐藏
|
||||
setTabBarHidden(!!this.data.editVisible)
|
||||
// 未登录直接回登录页(幂等跳转),不再发出必然 401 的请求
|
||||
// 未登录:游客态展示引导卡,零请求,不再强制跳登录(微信审核合规要求)
|
||||
if (!auth.isLoggedIn()) {
|
||||
redirectToLogin()
|
||||
if (!this.data.guest) {
|
||||
// 退出登录后回到本页时清掉残留资料,避免展示上一账号信息
|
||||
this.setData({
|
||||
guest: true,
|
||||
userInfo: {} as UserInfo,
|
||||
vipLabel: '',
|
||||
zodiac: '',
|
||||
quotaStats: [],
|
||||
uploadRemain: 0,
|
||||
unread: 0,
|
||||
})
|
||||
}
|
||||
return
|
||||
}
|
||||
// 登录成功回到本页:清掉游客态,拉取真实资料
|
||||
if (this.data.guest) {
|
||||
logger.info(LOG, '检测到登录态,从游客态切回真实资料')
|
||||
this.setData({ guest: false })
|
||||
}
|
||||
this.consumeOpenEditMark()
|
||||
this.fetchUser()
|
||||
this.fetchQuota()
|
||||
this.fetchUnread()
|
||||
},
|
||||
|
||||
// 未登录时的统一拦截:进入登录页,由用户自行选择是否登录
|
||||
needLogin(): boolean {
|
||||
if (auth.isLoggedIn()) return false
|
||||
logger.debug(LOG, '游客态点击受限入口,引导登录')
|
||||
goLogin()
|
||||
return true
|
||||
},
|
||||
|
||||
// 游客态点击资料卡 / 登录引导
|
||||
onGuestLogin() {
|
||||
this.needLogin()
|
||||
},
|
||||
|
||||
// 离开本页时恢复标签栏:此时抽屉不再可见,标签栏不能残留隐藏
|
||||
onHide() {
|
||||
setTabBarHidden(false)
|
||||
@@ -172,6 +209,7 @@ Page({
|
||||
},
|
||||
|
||||
onEdit() {
|
||||
if (this.needLogin()) return
|
||||
const u = this.data.userInfo
|
||||
// 抽屉打开期间隐藏悬浮标签栏:tabBar 由框架渲染在页面之上,否则会压住抽屉底部按钮
|
||||
setTabBarHidden(true)
|
||||
@@ -284,24 +322,28 @@ Page({
|
||||
},
|
||||
|
||||
onTapMall() {
|
||||
if (this.needLogin()) return
|
||||
wx.navigateTo({
|
||||
url: '/pages/mall/mall',
|
||||
fail: (e) => logger.warn(LOG, 'navigateTo 商城失败, err=', e && e.errMsg),
|
||||
})
|
||||
},
|
||||
onTapOrder() {
|
||||
if (this.needLogin()) return
|
||||
wx.navigateTo({
|
||||
url: '/pages/order/order',
|
||||
fail: (e) => logger.warn(LOG, 'navigateTo 订单失败, err=', e && e.errMsg),
|
||||
})
|
||||
},
|
||||
onTapNotification() {
|
||||
if (this.needLogin()) return
|
||||
wx.navigateTo({
|
||||
url: '/pages/notification/notification',
|
||||
fail: (e) => logger.warn(LOG, 'navigateTo 通知失败, err=', e && e.errMsg),
|
||||
})
|
||||
},
|
||||
onTapCollect() {
|
||||
if (this.needLogin()) return
|
||||
wx.setStorageSync(STORAGE_KEYS.OPEN_COLLECT, 1)
|
||||
wx.switchTab({
|
||||
url: '/pages/outfit/outfit',
|
||||
@@ -309,6 +351,7 @@ Page({
|
||||
})
|
||||
},
|
||||
onTapFlow() {
|
||||
if (this.needLogin()) return
|
||||
wx.navigateTo({
|
||||
url: '/pages/mall/mall?tab=flow',
|
||||
fail: (e) => logger.warn(LOG, 'navigateTo 流水失败, err=', e && e.errMsg),
|
||||
|
||||
@@ -7,8 +7,25 @@
|
||||
<view class="eyebrow">Profile</view>
|
||||
</view>
|
||||
|
||||
<!-- 游客态资料卡:点击进入登录页,登录与否由用户自行选择 -->
|
||||
<view wx:if="{{guest}}" class="pf-hero" bindtap="onGuestLogin">
|
||||
<view class="pf-av">
|
||||
<view class="icon icon-user"></view>
|
||||
</view>
|
||||
<view class="pf-info">
|
||||
<view class="pf-name">未登录</view>
|
||||
<view class="pf-sub">
|
||||
<text class="pill pill--line">浏览模式</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="pf-edit">
|
||||
点击登录
|
||||
<view class="icon icon-chevron-right"></view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 资料区:大号头像 + 衬线昵称 + 胶囊标签 -->
|
||||
<view class="pf-hero">
|
||||
<view wx:else class="pf-hero">
|
||||
<view class="pf-av">
|
||||
<image wx:if="{{userInfo.avatar}}" class="pf-av-img" src="{{userInfo.avatar}}" mode="aspectFill" />
|
||||
<view wx:else class="icon icon-user"></view>
|
||||
@@ -36,8 +53,8 @@
|
||||
<view class="icon icon-chevron-right"></view>
|
||||
</view>
|
||||
|
||||
<!-- 我的额度:四栏发丝线数字条 -->
|
||||
<view class="pf-quota" bindtap="onTapMall">
|
||||
<!-- 我的额度:四栏发丝线数字条(游客态不展示,避免 0/0 误导) -->
|
||||
<view wx:if="{{!guest}}" class="pf-quota" bindtap="onTapMall">
|
||||
<view class="pf-quota-hd">
|
||||
<text class="eyebrow">Quota</text>
|
||||
<text class="qk">我的额度</text>
|
||||
@@ -113,6 +130,10 @@
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view wx:if="{{guest}}" class="guest-foot" bindtap="onGuestLogin">
|
||||
<text>登录后同步你的衣橱、穿搭与额度</text>
|
||||
<text class="gf-a">去登录</text>
|
||||
</view>
|
||||
<view class="pf-ver">v1.0.0</view>
|
||||
<view class="gap-64"></view>
|
||||
</scroll-view>
|
||||
|
||||
Reference in New Issue
Block a user