fix:bug

This commit is contained in:
2026-09-13 23:32:35 +08:00
parent 323f520d7b
commit 1a11816839
14 changed files with 701 additions and 46 deletions
+102 -14
View File
@@ -1,6 +1,6 @@
import { request, redirectToLogin } from '../../utils/request'
import * as auth from '../../utils/auth'
import { PagedResult, ClosetShareItem } from '../../types/models'
import { PagedResult, ClosetShareItem, OutfitShareItem } from '../../types/models'
import { ShareStatus, ShareType } from '../../utils/config'
import { normalizePaged, mergePaged, hasMorePaged } from '../../utils/paged'
import { setTabBarSelected } from '../../utils/tabbar'
@@ -9,6 +9,21 @@ import { logger } from '../../utils/logger'
// 日志模块名
const LOG = 'closet-share'
// 统一的分享列表项:衣柜分享与穿搭分享合并展示
interface ShareListItem {
kind: 'closet' | 'outfit'
share_uuid: string
title: string
typeText: string
expireText: string
status: number
created_at: number
owner_name?: string
owner_avatar?: string
cover?: string
_invalid: boolean
}
Page({
data: {
tabs: [
@@ -16,7 +31,7 @@ Page({
{ name: '分享给我的' },
],
activeTab: 0, // 0 我的分享 1 分享给我的
list: [] as ClosetShareItem[],
list: [] as ShareListItem[],
loading: true,
loadingMore: false,
page: 1,
@@ -63,19 +78,26 @@ Page({
},
fetchList(page: number) {
const url = this.data.activeTab === 0 ? '/closet-share' : '/closet-share/received'
if (this.data.activeTab === 1) return this.fetchReceived(page)
return this.fetchMine(page)
},
// 我的分享:仅衣柜分享
fetchMine(page: number) {
// 请求序号:切 tab 时旧响应可能后到,序号不匹配直接丢弃
const seq = ((this as any).reqSeq || 0) + 1
;(this as any).reqSeq = seq
if (page > 1) this.setData({ loadingMore: true })
request<PagedResult<ClosetShareItem>>({ url, data: { page, page_size: this.data.pageSize } })
request<PagedResult<ClosetShareItem>>({
url: '/closet-share',
data: { page, page_size: this.data.pageSize },
})
.then((res) => {
if ((this as any).reqSeq !== seq) return
const { list: raw, total } = normalizePaged<ClosetShareItem>(res)
logger.debug(LOG, '列表加载成功, tab=', this.data.activeTab, 'page=', page, '条数=', raw && raw.length)
const list = raw.map((it) => this.decorate(it))
logger.debug(LOG, '我的分享加载成功, page=', page, '条数=', raw && raw.length)
const list = raw.map((it) => this.decorateCloset(it))
const merged = mergePaged(this.data.list, list, page === 1)
this.setData({
list: merged,
@@ -87,12 +109,50 @@ Page({
})
.catch((e: any) => {
if ((this as any).reqSeq !== seq) return
logger.warn(LOG, '列表加载失败, tab=', this.data.activeTab, 'page=', page, 'code=', e && e.code)
logger.warn(LOG, '我的分享加载失败, page=', page, 'code=', e && e.code)
this.setData({ loading: false, loadingMore: false })
})
},
decorate(it: ClosetShareItem) {
// 分享给我的:衣柜分享 + 穿搭分享并行拉取后按时间倒序合并
fetchReceived(page: number) {
const seq = ((this as any).reqSeq || 0) + 1
;(this as any).reqSeq = seq
if (page > 1) this.setData({ loadingMore: true })
Promise.all([
request<PagedResult<ClosetShareItem>>({
url: '/closet-share/received',
data: { page, page_size: this.data.pageSize },
}),
request<PagedResult<OutfitShareItem>>({
url: '/outfit-share/received',
data: { page, page_size: this.data.pageSize },
}),
])
.then(([closetRes, outfitRes]) => {
if ((this as any).reqSeq !== seq) return
const closetList = normalizePaged<ClosetShareItem>(closetRes).list.map((it) => this.decorateCloset(it))
const outfitList = normalizePaged<OutfitShareItem>(outfitRes).list.map((it) => this.decorateOutfit(it))
logger.debug(LOG, '分享给我的加载成功, page=', page, '衣柜=', closetList.length, '穿搭=', outfitList.length)
const prev = page === 1 ? [] : this.data.list
const merged = prev
.concat(closetList, outfitList)
.sort((a, b) => (b.created_at || 0) - (a.created_at || 0))
// 任一侧仍返回满页则认为还有更多
const hasMore =
closetList.length >= this.data.pageSize || outfitList.length >= this.data.pageSize
this.setData({ list: merged, hasMore, loading: false, loadingMore: false, page })
})
.catch((e: any) => {
if ((this as any).reqSeq !== seq) return
logger.warn(LOG, '分享给我的加载失败, page=', page, 'code=', e && e.code)
this.setData({ loading: false, loadingMore: false })
})
},
// 衣柜分享项:本地惰性过期 + 状态文案
decorateCloset(it: ClosetShareItem): ShareListItem {
const now = Math.floor(Date.now() / 1000)
let status = it.status
if (status === ShareStatus.NORMAL && it.expire_time > 0 && it.expire_time < now) {
@@ -109,10 +169,15 @@ Page({
}
return {
...it,
_status: status,
_expireText: expireText,
_typeText: it.share_type === ShareType.PARTIAL ? '部分衣物' : '全量衣橱',
kind: 'closet',
share_uuid: it.share_uuid,
title: `衣柜分享 · ${it.clothes_count} 件`,
typeText: it.share_type === ShareType.PARTIAL ? '部分衣物' : '全量衣橱',
expireText,
status,
created_at: it.created_at || 0,
owner_name: it.owner_name,
owner_avatar: it.owner_avatar,
_invalid:
status === ShareStatus.CANCELLED ||
status === ShareStatus.EXPIRED ||
@@ -120,6 +185,24 @@ Page({
}
},
// 穿搭分享项
decorateOutfit(it: OutfitShareItem): ShareListItem {
const cancelled = it.status === ShareStatus.CANCELLED
return {
kind: 'outfit',
share_uuid: it.share_uuid,
title: it.outfit_name || '未命名穿搭',
typeText: `穿搭分享 · ${it.items_count} 件`,
expireText: cancelled ? '已取消' : '有效',
status: it.status,
created_at: it.created_at || 0,
owner_name: it.owner_name,
owner_avatar: it.owner_avatar,
cover: it.cover_image,
_invalid: cancelled,
}
},
onCreate() {
wx.navigateTo({
url: '/pages/closet-share-create/closet-share-create',
@@ -129,9 +212,14 @@ Page({
onItemTap(e: WechatMiniprogram.TouchEvent) {
const uuid = e.currentTarget.dataset.uuid as string
logger.debug(LOG, '点击分享项, uuid=', uuid)
const kind = e.currentTarget.dataset.kind as string
logger.debug(LOG, '点击分享项, kind=', kind, 'uuid=', uuid)
const url =
kind === 'outfit'
? `/pages/outfit-share-detail/outfit-share-detail?uuid=${uuid}`
: `/pages/closet-share-detail/closet-share-detail?uuid=${uuid}`
wx.navigateTo({
url: `/pages/closet-share-detail/closet-share-detail?uuid=${uuid}`,
url,
fail: (err) => logger.warn(LOG, 'navigateTo 分享详情失败, err=', err && err.errMsg),
})
},