251 lines
6.2 KiB
JavaScript
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() {
|
|
}
|
|
}) |