import { request, redirectToLogin } from '../../utils/request' import * as auth from '../../utils/auth' import { PagedResult, ClothesItem, QuotaItem } from '../../types/models' import { QuotaType } from '../../utils/config' const CATEGORIES = [ { name: '全部', value: '' }, { name: '上装', value: '上装' }, { name: '下装', value: '下装' }, { name: '连衣裙', value: '连衣裙' }, { name: '外套', value: '外套' }, { name: '鞋', value: '鞋' }, { name: '配饰', value: '配饰' }, ] Page({ data: { categories: CATEGORIES, activeCategory: 0, list: [] as ClothesItem[], total: 0, uploadRemain: 0, loading: true, refreshing: false, page: 1, pageSize: 20, hasMore: true, }, onShow() { this.syncTabBar() // 未登录直接回登录页(幂等跳转),不再发出必然 401 的请求 if (!auth.isLoggedIn()) { redirectToLogin() return } this.refresh() }, syncTabBar() { const tabBar = (this as any).getTabBar && (this as any).getTabBar() if (tabBar) tabBar.setData({ selected: 0 }) }, refresh() { this.setData({ page: 1, hasMore: true, loading: this.data.list.length === 0 }) this.fetchList(1) this.fetchQuota() }, onRefresh() { this.setData({ refreshing: true }) Promise.all([this.fetchList(1), this.fetchQuota()]).finally(() => { this.setData({ refreshing: false }) }) }, onReachBottom() { if (!this.data.hasMore || this.data.loading) return this.fetchList(this.data.page + 1) }, fetchList(page: number): Promise { const cat = CATEGORIES[this.data.activeCategory].value const params: Record = { page, page_size: this.data.pageSize } if (cat) params.category_main = cat return request>({ url: '/clothes', data: params }) .then((res) => { const list = res.list.map((it) => ({ ...it, _statusText: !it.category_main && !it.processed_image ? 'AI 处理中' : '', _statusType: 'blue', })) const merged = page === 1 ? list : this.data.list.concat(list) this.setData({ list: merged, total: res.total, hasMore: merged.length < res.total, loading: false, page, }) }) .catch(() => { this.setData({ loading: false }) }) }, fetchQuota(): Promise { return request<{ quotas: QuotaItem[] }>({ url: '/quota/info', showError: false, silentAuth: true }) .then((res) => { const upload = res.quotas.find((q) => q.quota_type === QuotaType.UPLOAD) if (upload) this.setData({ uploadRemain: upload.remain }) }) .catch(() => {}) }, onCategoryTap(e: WechatMiniprogram.TouchEvent) { const index = Number(e.currentTarget.dataset.index) if (index === this.data.activeCategory) return this.setData({ activeCategory: index, list: [], loading: true }) this.refresh() }, onClothesTap(e: WechatMiniprogram.CustomEvent) { const item = e.detail.item as ClothesItem wx.navigateTo({ url: `/pages/clothes-detail/clothes-detail?uuid=${item.clothes_uuid}` }) }, onUpload() { wx.navigateTo({ url: '/pages/upload/upload' }) }, })