feat: 支持游客免登录浏览核心页面

未登录用户可先浏览衣橱、穿搭、运势、分享等内容,登录改为用户主动选择,并在登录页增加协议勾选确认与暂不登录入口。
This commit is contained in:
2026-09-16 21:44:04 +08:00
parent c07a969642
commit 45222317af
47 changed files with 996 additions and 12150 deletions
+46 -3
View File
@@ -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),
+24 -3
View File
@@ -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>