feat(guest): 支持游客态浏览示例衣物与搭配
游客可点开示例衣物详情与搭配抽屉,不再在浏览路径上要求登录。
This commit is contained in:
@@ -8,7 +8,7 @@ import { OutfitStatusPill, isPendingSave, outfitStatusPill } from '../../utils/o
|
||||
import { setTabBarSelected } from '../../utils/tabbar'
|
||||
import { formatRelativeTime } from '../../utils/format'
|
||||
import { navScroll } from '../../utils/nav'
|
||||
import { GUEST_OUTFITS, goLogin } from '../../utils/guest'
|
||||
import { GUEST_OUTFIT, goLogin } from '../../utils/guest'
|
||||
import { logger } from '../../utils/logger'
|
||||
|
||||
// 日志模块名
|
||||
@@ -45,9 +45,11 @@ Page({
|
||||
pendingCount: 0,
|
||||
// 滚动收缩:由 utils/nav.ts 的共享 handler 驱动
|
||||
navScrolled: false,
|
||||
// 游客态(未登录):展示本地示例穿搭,不发需要授权的请求
|
||||
// 游客态(未登录):只展示本地示例穿搭,不发需要授权的请求
|
||||
guest: false,
|
||||
guestList: GUEST_OUTFITS,
|
||||
guestOutfit: GUEST_OUTFIT,
|
||||
// 游客态示例搭配抽屉:可完整浏览示例单品,浏览路径上不要求登录
|
||||
guestSheetVisible: false,
|
||||
},
|
||||
|
||||
// scroll-view 滚动 → 导航收缩为玻璃小标题
|
||||
@@ -72,7 +74,7 @@ Page({
|
||||
if (this.data.guest) {
|
||||
logger.info(LOG, '检测到登录态,从游客态切换为真实穿搭列表')
|
||||
;(this as any).firstShown = true
|
||||
this.setData({ guest: false, guestList: [], list: [], loading: true })
|
||||
this.setData({ guest: false, guestSheetVisible: false, list: [], loading: true })
|
||||
this.refresh()
|
||||
this.fetchPendingCount()
|
||||
return
|
||||
@@ -116,12 +118,32 @@ Page({
|
||||
this.refresh()
|
||||
},
|
||||
|
||||
// 游客态点击示例穿搭 / 受限入口:统一进入登录页,由用户自行选择是否登录
|
||||
// 游客态点击受限入口:进入登录页,由用户自行选择是否登录
|
||||
onGuestLogin() {
|
||||
logger.debug(LOG, '游客态点击受限入口,引导登录')
|
||||
goLogin()
|
||||
},
|
||||
|
||||
// 抽屉内容点击不穿透到遮罩
|
||||
noop() {},
|
||||
|
||||
// 游客态点击示例搭配:打开只读示例抽屉(浏览路径上不要求登录)
|
||||
onGuestOutfitTap() {
|
||||
logger.debug(LOG, '游客态打开示例搭配抽屉')
|
||||
this.setData({ guestSheetVisible: true })
|
||||
},
|
||||
|
||||
onGuestSheetClose() {
|
||||
this.setData({ guestSheetVisible: false })
|
||||
},
|
||||
|
||||
// 抽屉底部入口:用户主动选择登录时才进入登录页
|
||||
onGuestSheetLogin() {
|
||||
logger.info(LOG, '示例搭配抽屉内主动登录')
|
||||
this.setData({ guestSheetVisible: false })
|
||||
goLogin()
|
||||
},
|
||||
|
||||
refresh() {
|
||||
this.setData({ page: 1, hasMore: true, loading: this.data.list.length === 0 })
|
||||
this.fetchList(1)
|
||||
|
||||
@@ -63,26 +63,25 @@
|
||||
bind:action="onCreate"
|
||||
/>
|
||||
|
||||
<!-- 游客态:本地示例穿搭(点击任一示例进入登录页) -->
|
||||
<!-- 游客态:只展示一套本地示例搭配,点击可完整浏览(不要求登录) -->
|
||||
<view wx:elif="{{guest}}" class="of-list">
|
||||
<view class="of-card" wx:for="{{guestList}}" wx:key="key" bindtap="onGuestLogin">
|
||||
<view class="collage collage--{{item.icons.length}}">
|
||||
<view class="cg" wx:for="{{item.icons}}" wx:for-item="ic" wx:key="*this">
|
||||
<view class="ph icon {{ic}}"></view>
|
||||
<view class="of-card" bindtap="onGuestOutfitTap">
|
||||
<view class="collage collage--2">
|
||||
<view class="cg" wx:for="{{guestOutfit.items}}" wx:key="clothes_uuid">
|
||||
<image class="pic" src="{{item.processed_image}}" mode="aspectFit" />
|
||||
</view>
|
||||
<view class="guest-flag">示例</view>
|
||||
</view>
|
||||
<view class="of-trow">
|
||||
<text class="of-title">{{item.name}}</text>
|
||||
<text class="pill pill--line">{{item.scene}}</text>
|
||||
<text class="of-title">{{guestOutfit.name}}</text>
|
||||
<text class="pill pill--line">{{guestOutfit.scene}}</text>
|
||||
</view>
|
||||
<view class="of-desc">{{item.desc}}</view>
|
||||
<view class="of-desc">{{guestOutfit.desc}}</view>
|
||||
<view class="of-meta">
|
||||
<text class="of-m">{{item.icons.length}} 件衣物</text>
|
||||
<text class="pill">示例</text>
|
||||
<text class="of-m">{{guestOutfit.items.length}} 件衣物</text>
|
||||
<view class="spacer"></view>
|
||||
<view class="of-m">
|
||||
<view class="icon icon-heart"></view>
|
||||
<text class="num">-</text>
|
||||
<view class="icon icon-chevron-right"></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
@@ -151,4 +150,38 @@
|
||||
<view class="btn btn--glass" bindtap="onCreate">创建穿搭</view>
|
||||
<view class="btn btn--ink" bindtap="onAiRecommend">AI 推荐</view>
|
||||
</view>
|
||||
|
||||
<!-- 游客态示例搭配抽屉:可完整浏览示例单品,登录仅由用户主动选择 -->
|
||||
<view wx:if="{{guestSheetVisible}}" class="scrim" bindtap="onGuestSheetClose"></view>
|
||||
<view wx:if="{{guestSheetVisible}}" class="sheet-wrap">
|
||||
<view class="sheet" catchtap="noop">
|
||||
<view class="sheet-grab"></view>
|
||||
<view class="sheet-hd">
|
||||
<text class="sheet-t">示例搭配</text>
|
||||
<text class="sheet-x" bindtap="onGuestSheetClose">关闭</text>
|
||||
</view>
|
||||
<view class="sheet-body">
|
||||
<view class="gd-hd">
|
||||
<view class="t-lg">{{guestOutfit.name}}</view>
|
||||
<view class="gd-tags">
|
||||
<text class="pill pill--line">{{guestOutfit.scene}}</text>
|
||||
<text class="pill">示例</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="gd-desc">{{guestOutfit.desc}}</view>
|
||||
<view class="gd-items">
|
||||
<view class="gd-item" wx:for="{{guestOutfit.items}}" wx:key="clothes_uuid">
|
||||
<view class="gd-item-img">
|
||||
<image class="pic" src="{{item.processed_image}}" mode="aspectFit" />
|
||||
</view>
|
||||
<view class="tile-name">{{item.name}}</view>
|
||||
<view class="tile-sub">{{item.category_main}}{{item.category_sub ? ' · ' + item.category_sub : ''}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="sheet-foot">
|
||||
<view class="btn btn--ghost btn--block" bindtap="onGuestSheetLogin">登录后可创建你的穿搭</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@@ -192,3 +192,45 @@
|
||||
width: 26rpx;
|
||||
height: 26rpx;
|
||||
}
|
||||
|
||||
/* ===== 游客态:示例搭配抽屉(只读浏览,不要求登录) ===== */
|
||||
.gd-hd {
|
||||
padding: 8rpx var(--pad) 0;
|
||||
}
|
||||
|
||||
.gd-tags {
|
||||
display: flex;
|
||||
gap: 12rpx;
|
||||
margin-top: 18rpx;
|
||||
}
|
||||
|
||||
.gd-desc {
|
||||
margin-top: 18rpx;
|
||||
padding: 0 var(--pad);
|
||||
font-size: 26rpx;
|
||||
line-height: 1.6;
|
||||
color: var(--ink-2);
|
||||
}
|
||||
|
||||
.gd-items {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 32rpx 26rpx;
|
||||
padding: 40rpx var(--pad) 0;
|
||||
}
|
||||
|
||||
.gd-item-img {
|
||||
width: 100%;
|
||||
aspect-ratio: 1 / 1;
|
||||
background: var(--paper-2);
|
||||
border-radius: var(--r-img);
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.gd-item-img .pic {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user