Files
xingque/pages/product-detail/product-detail.js
2026-07-09 00:17:03 +08:00

251 lines
6.2 KiB
JavaScript

// pages/product-detail/product-detail.js
const app = getApp()
import { ensureLogin } from '../../utils/login'
import { backfillUserProfileCache } from '../../utils/role-tab-bar'
import { buildClubHeaders } from '../../utils/club-context.js'
Page({
data: {
ossImageUrl: '',
apiBaseUrl: '',
shangpinId: '',
shangpinTitle: '',
shangpinPrice: '',
shangpinData: null,
isLoading: true,
loadError: false,
// 页面字段映射
fieldMapping: {
tupian: 'tupian',
biaoti: 'biaoti',
jiage: 'jiage',
xiangqing: 'xiangqing',
xiadanxuzhi: 'xiadanxuzhi',
guize: 'guize',
xiaoliang: 'xiaoliang',
kucun: 'kucun',
fenlei: 'fenlei',
pingfen: 'pingfen'
}
},
onLoad(options) {
this.setData({
ossImageUrl: app.globalData.ossImageUrl,
apiBaseUrl: app.globalData.apiBaseUrl,
shangpinId: options.id || '',
shangpinTitle: options.title || '',
shangpinPrice: options.price || ''
})
if (!this.data.shangpinId) {
wx.showToast({
title: '商品不存在',
icon: 'none'
})
setTimeout(() => {
wx.navigateBack()
}, 1500)
return
}
this.loadShangpinDetail()
},
onShow() {
backfillUserProfileCache(app);
this.registerNotificationComponent();
},
registerNotificationComponent() {
const app = getApp();
const notificationComp = this.selectComponent('#global-notification');
if (notificationComp && notificationComp.showNotification) {
app.globalData.globalNotification = {
show: (data) => notificationComp.showNotification(data),
hide: () => notificationComp.hideNotification()
};
}
},
loadShangpinDetail() {
const that = this
const { shangpinId, apiBaseUrl } = this.data
this.setData({ isLoading: true, loadError: false })
wx.request({
url: apiBaseUrl + '/shangpin/xiangqinghuoqu/',
method: 'POST',
header: buildClubHeaders({ 'content-type': 'application/json' }),
data: {
shangpin_id: shangpinId
},
success(res) {
if (res.statusCode === 200 && res.data && res.data.code === 0) {
const shangpinData = res.data.data || {}
// 处理价格
if (shangpinData.jiage) {
const jiage = parseFloat(shangpinData.jiage) || 0
const priceInteger = Math.floor(jiage)
let priceDecimal = '00'
const decimalPart = (jiage - priceInteger).toFixed(2)
if (decimalPart > 0) {
priceDecimal = decimalPart.toString().split('.')[1]
}
shangpinData.priceInteger = priceInteger
shangpinData.priceDecimal = priceDecimal
}
// 处理图片URL
if (shangpinData.tupian && !shangpinData.tupian.startsWith('http')) {
shangpinData.tupian = that.data.ossImageUrl + shangpinData.tupian
}
// 处理规则图片URL
if (shangpinData.guize && !shangpinData.guize.startsWith('http')) {
shangpinData.guize = that.data.ossImageUrl + shangpinData.guize
}
// 处理销量显示
if (shangpinData.xiaoliang) {
shangpinData.xiaoliangText = that.formatXiaoliang(shangpinData.xiaoliang)
}
// 处理库存显示
if (shangpinData.kucun) {
shangpinData.kucunText = shangpinData.kucun + '件'
shangpinData.kucunClass = shangpinData.kucun > 0 ? 'kucun-normal' : 'kucun-none'
}
// 设置页面标题
if (shangpinData.biaoti) {
wx.setNavigationBarTitle({
title: '商品详情'
})
}
that.setData({
shangpinData: shangpinData,
isLoading: false
})
} else {
that.handleLoadError(res.data?.msg || '加载失败')
}
},
fail() {
that.handleLoadError('网络错误,请重试')
}
})
},
formatXiaoliang(xiaoliang) {
const num = parseInt(xiaoliang) || 0
if (num >= 10000) {
return (num / 10000).toFixed(1) + '万+'
} else if (num >= 1000) {
return (num / 1000).toFixed(1) + '千+'
} else {
return num + ''
}
},
handleLoadError(errorMsg) {
this.setData({
isLoading: false,
loadError: true
})
wx.showToast({
title: errorMsg || '加载失败',
icon: 'none',
duration: 2000
})
// 3秒后自动返回
setTimeout(() => {
wx.navigateBack()
}, 3000)
},
previewImage() {
const { shangpinData } = this.data
if (!shangpinData || !shangpinData.tupian) return
wx.previewImage({
current: shangpinData.tupian,
urls: [shangpinData.tupian]
})
},
async onOrderClick() {
const { shangpinData, shangpinId } = this.data
// 检查库存
if (shangpinData && shangpinData.kucun <= 0) {
wx.showToast({
title: '商品已售罄',
icon: 'none'
})
return
}
// 验证必要数据
if (!shangpinData || !shangpinData.biaoti) {
wx.showToast({
title: '商品信息不完整',
icon: 'none'
})
return
}
try {
await ensureLogin()
} catch (e) {
return
}
const orderData = {
id: shangpinId,
title: shangpinData.biaoti,
price: shangpinData.jiage,
priceInteger: shangpinData.priceInteger,
priceDecimal: shangpinData.priceDecimal,
image: shangpinData.tupian,
kucun: shangpinData.kucun || 0,
xiaoliang: shangpinData.xiaoliang || 0
}
wx.navigateTo({
url: `/pages/submit/submit?data=${encodeURIComponent(JSON.stringify(orderData))}`
})
},
onRefresh() {
this.loadShangpinDetail()
},
goToKefu() {
wx.navigateTo({ url: '/pages/cs-chat/cs-chat' })
},
onShareAppMessage() {
const { shangpinData, shangpinId } = this.data
return {
title: shangpinData?.biaoti || '阿龙电竞 - 商品详情',
path: `/pages/product-detail/product-detail?id=${shangpinId}`,
imageUrl: shangpinData?.tupian || ''
}
},
onUnload() {
}
})