const app = getApp(); const svc = require('../../services/exercise'); const DIM_MAP = { bodyPart: 'body-parts', equipment: 'equipment', target: 'targets', muscleGroup: 'muscle-groups', type: 'types' }; function labelForDim(d) { return ({ bodyPart: '按部位', equipment: '按器械', target: '按目标', muscleGroup: '按肌群', type: '按类型' })[d] || '分类'; } Page({ data: { statusBarHeight: 20, dimension: 'bodyPart', title: '分类', value: '', values: [], activeValue: '', exercises: [], loading: true, loadingMore: false, hasMore: true, page: 1, pageSize: 20, total: 0 }, onLoad(query) { const dimension = query.dimension || 'bodyPart'; const value = query.value || ''; const title = query.title || labelForDim(dimension); this.setData({ statusBarHeight: app.globalData.statusBarHeight || 20, dimension, value, title }); this.loadValues(); }, loadValues() { this.setData({ loading: true }); const key = DIM_MAP[this.data.dimension] || 'body-parts'; svc.getCategories(key).then((items) => { const list = (items || []).slice(); // 头部插入「全部」项:无 value 入参时默认选中,明确当前为「全部」 list.unshift({ value: '', label: '全部' }); const activeValue = this.data.value || ''; this.setData({ values: list, activeValue: activeValue, loading: false }); this.loadExercises(); }).catch(() => { this.setData({ loading: false }); }); }, loadExercises() { this.setData({ loading: true, page: 1 }); const params = { page: 1, pageSize: this.data.pageSize }; params[this.data.dimension] = this.data.activeValue; svc.listExercises(params).then((res) => { const items = (res && res.items) || []; const total = (res && res.total) || 0; this.setData({ exercises: items, total, loading: false, hasMore: items.length < total }); }).catch(() => { this.setData({ loading: false }); }); }, onReachBottom() { if (this.data.loading || this.data.loadingMore || !this.data.hasMore) return; this.loadMore(); }, loadMore() { const next = this.data.page + 1; this.setData({ loadingMore: true }); const params = { page: next, pageSize: this.data.pageSize }; params[this.data.dimension] = this.data.activeValue; svc.listExercises(params).then((res) => { const items = (res && res.items) || []; const total = (res && res.total) || 0; const merged = this.data.exercises.concat(items); this.setData({ exercises: merged, total, page: next, loadingMore: false, hasMore: merged.length < total }); }).catch(() => { this.setData({ loadingMore: false }); }); }, onValue(e) { const value = e.detail.value; if (value === this.data.activeValue) return; this.setData({ activeValue: value, page: 1 }, () => this.loadExercises()); }, onExercise(e) { if (!e || !e.detail || !e.detail.id) return; wx.navigateTo({ url: '/pages/detail/detail?id=' + encodeURIComponent(e.detail.id) }); } });