yingsa/miniprogram/pages/store/index.js
ethanfly 98f9e64d91 refactor: Enhance store and user management features
- Updated user information retrieval to support store-specific points and ladder user data.
- Refactored store initialization logic to prioritize last selected store.
- Improved API endpoints for fetching matches and user data, ensuring compatibility with store context.
- Adjusted UI components to display store-related information consistently across various pages.
- Enhanced error handling and data fetching logic for better user experience.
2026-02-07 11:09:37 +08:00

182 lines
4.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const app = getApp()
Page({
data: {
stores: [],
currentStoreId: null,
currentStoreName: '',
currentStoreAddress: '',
loading: false
},
onLoad() {
this.initCurrentStore()
this.fetchStores()
},
onShow() {
// 每次显示页面时刷新当前门店信息
this.initCurrentStore()
},
async onPullDownRefresh() {
try {
await this.fetchStores()
} finally {
wx.stopPullDownRefresh()
}
},
// 初始化当前门店信息(优先全局,其次从上次选择恢复)
initCurrentStore() {
let currentStore = app.globalData.currentStore
if (!currentStore) {
const lastStore = wx.getStorageSync('last_store')
if (lastStore && lastStore.storeId) {
currentStore = {
storeId: lastStore.storeId,
storeName: lastStore.storeName || '',
storeAddress: lastStore.storeAddress || ''
}
app.globalData.currentStore = currentStore
}
}
if (currentStore) {
this.setData({
currentStoreId: currentStore.storeId,
currentStoreName: currentStore.storeName || '',
currentStoreAddress: currentStore.storeAddress || ''
})
}
},
formatDistance(meters) {
if (!meters) return ''
if (meters < 1000) {
return Math.round(meters) + 'm'
}
return (meters / 1000).toFixed(1) + 'km'
},
async fetchStores() {
this.setData({ loading: true })
try {
// 如果已登录,尝试获取附近门店
if (app.globalData.token) {
wx.getLocation({
type: 'gcj02',
success: async (loc) => {
try {
const res = await app.request('/api/store/nearby', {
latitude: loc.latitude,
longitude: loc.longitude
})
this.setData({
stores: res.data || [],
loading: false
})
// 更新当前门店的完整信息(地址等)
this.updateCurrentStoreInfo(res.data || [])
} catch (e) {
// 如果失败fallback 到门店列表
this.fetchStoreList()
}
},
fail: () => {
this.fetchStoreList()
}
})
} else {
// 未登录,直接获取门店列表
this.fetchStoreList()
}
} catch (e) {
console.error('获取门店列表失败:', e)
this.setData({ loading: false })
}
},
async fetchStoreList() {
try {
const res = await app.request('/api/store/list')
const stores = res.data.list || []
this.setData({
stores: stores,
loading: false
})
// 更新当前门店的完整信息
this.updateCurrentStoreInfo(stores)
} catch (e) {
console.error('获取门店列表失败:', e)
this.setData({ loading: false })
}
},
// 从门店列表中更新当前门店的完整信息
updateCurrentStoreInfo(stores) {
const { currentStoreId } = this.data
if (!currentStoreId || !stores.length) return
const currentStore = stores.find(s => s.id === currentStoreId)
if (currentStore) {
this.setData({
currentStoreName: currentStore.name,
currentStoreAddress: currentStore.address
})
// 同时更新全局数据
app.globalData.currentStore = {
storeId: currentStore.id,
storeName: currentStore.name,
storeAddress: currentStore.address
}
}
},
async selectStore(e) {
const store = e.currentTarget.dataset.store
wx.showLoading({ title: '切换中...' })
this.setData({
currentStoreId: store.id,
currentStoreName: store.name,
currentStoreAddress: store.address
})
// 更新全局门店
app.globalData.currentStore = {
storeId: store.id,
storeName: store.name,
storeAddress: store.address
}
// 持久化上次选择的门店,下次启动优先使用
wx.setStorageSync('last_store', {
storeId: store.id,
storeName: store.name,
storeAddress: store.address
})
// 清空旧的天梯用户信息
app.globalData.ladderUser = null
// 获取该门店的天梯用户信息
try {
await app.getLadderUser(store.id)
} catch (e) {
console.error('获取天梯信息失败:', e)
}
// 标记需要刷新数据
app.globalData.storeChanged = true
wx.hideLoading()
wx.showToast({ title: '切换成功', icon: 'success' })
setTimeout(() => {
wx.navigateBack()
}, 800)
}
})