import { injectPage } from '@jdmini/api' const { getWorksheetDetail, checkPoints, deductPoints } = require('../../utils/api.js') const { DATA_BASE_URL } = require('../../utils/config.js') Page(injectPage({})({ data: { dataBaseUrl: DATA_BASE_URL, id: null, detail: {}, recommended: [], loading: false, downloadedPath: '' }, onLoad(options) { if (options.id) { this.setData({ id: Number(options.id) }) this.loadDetail() } }, onShareAppMessage() { const userId = wx.getStorageSync('userId') let path = `/pages/detail/detail?id=${this.data.id}` // 携带邀请人ID if (userId) { path += `&inviter=${userId}` } return { title: this.data.detail.title || '儿童练习表', path: path, imageUrl: DATA_BASE_URL + this.data.detail.coverurl } }, // 加载详情 async loadDetail() { try { this.setData({ loading: true }) const res = await getWorksheetDetail(this.data.id) if (res.success) { // 设置导航栏标题 wx.setNavigationBarTitle({ title: res.data.detail.title || '练习表详情' }) this.setData({ detail: res.data.detail || {}, recommended: res.data.recommended || [], loading: false }) } } catch (error) { console.error('加载详情失败:', error) this.setData({ loading: false }) wx.showToast({ title: '加载失败', icon: 'none' }) } }, // 预览封面大图 previewImage() { const url = DATA_BASE_URL + this.data.detail.coverurl wx.previewImage({ current: url, urls: [url] }) }, // 预览PDF previewPdf() { const pdfUrl = DATA_BASE_URL + this.data.detail.pdfurl wx.showLoading({ title: '加载中...', mask: true }) // 先下载PDF文件 wx.downloadFile({ url: pdfUrl, success: (res) => { wx.hideLoading() if (res.statusCode === 200) { // 打开PDF文档 wx.openDocument({ filePath: res.tempFilePath, fileType: 'pdf', showMenu: true, success: () => { console.log('PDF打开成功') }, fail: (err) => { console.error('打开PDF失败:', err) wx.showToast({ title: '打开失败', icon: 'none' }) } }) } }, fail: (err) => { wx.hideLoading() console.error('下载PDF失败:', err) wx.showToast({ title: '加载失败', icon: 'none' }) } }) }, // 检查是否已下载过 hasDownloaded(worksheetId) { const downloads = wx.getStorageSync('downloads') || [] return downloads.some(d => d.id === worksheetId) }, // 下载PDF async downloadPdf() { // 1. 检查是否登录 const userId = wx.getStorageSync('userId') if (!userId) { wx.showModal({ title: '提示', content: '请先登录后再下载', confirmText: '去登录', cancelText: '取消', success: (res) => { if (res.confirm) { // 保存返回信息 wx.setStorageSync('returnTo', { type: 'navigateTo', url: `/pages/detail/detail?id=${this.data.id}` }) wx.navigateTo({ url: '/pages/login/login' }) } } }) return } // 2. 检查是否已下载过(已下载过的不扣积分) const alreadyDownloaded = this.hasDownloaded(this.data.id) // 3. 如果未下载过,检查积分 if (!alreadyDownloaded) { try { const pointsRes = await checkPoints(userId) if (!pointsRes.success || !pointsRes.data.canDownload) { wx.showModal({ title: '积分不足', content: `下载需要 ${pointsRes.data?.costPoints || 1} 积分,您当前积分为 ${pointsRes.data?.points || 0}。分享小程序可获得积分!`, confirmText: '去分享', cancelText: '取消', success: (res) => { if (res.confirm) { // 触发分享 this.shareToGetPoints() } } }) return } } catch (error) { console.error('检查积分失败:', error) wx.showToast({ title: '网络错误', icon: 'none' }) return } } // 4. 开始下载 const pdfUrl = DATA_BASE_URL + this.data.detail.pdfurl const title = this.data.detail.e_title || this.data.detail.title || 'worksheet' const fileName = `${title}.pdf` wx.showLoading({ title: '下载中...', mask: true }) try { let remainingPoints = null // 只有首次下载才扣积分 if (!alreadyDownloaded) { const deductRes = await deductPoints(userId, this.data.id) if (!deductRes.success) { wx.hideLoading() wx.showToast({ title: deductRes.message || '扣除积分失败', icon: 'none' }) return } remainingPoints = deductRes.data.remainingPoints } // 下载文件 wx.downloadFile({ url: pdfUrl, success: (res) => { wx.hideLoading() if (res.statusCode === 200) { const tempFilePath = res.tempFilePath // 保存到本地 const fs = wx.getFileSystemManager() const savedPath = `${wx.env.USER_DATA_PATH}/${fileName}` fs.saveFile({ tempFilePath: tempFilePath, filePath: savedPath, success: (saveRes) => { this.setData({ downloadedPath: saveRes.savedFilePath }) // 保存下载记录 this.saveDownloadRecord() // 根据是否是首次下载显示不同提示 let content = '文件已保存,是否立即打开?' if (!alreadyDownloaded && remainingPoints !== null) { content = `文件已保存,消耗1积分,剩余${remainingPoints}积分。是否立即打开?` } else if (alreadyDownloaded) { content = '文件已保存(已购买,无需扣分)。是否立即打开?' } wx.showModal({ title: '下载成功', content: content, confirmText: '打开', cancelText: '稍后', success: (modalRes) => { if (modalRes.confirm) { wx.openDocument({ filePath: saveRes.savedFilePath, fileType: 'pdf', showMenu: true }) } } }) }, fail: (err) => { console.error('保存文件失败:', err) // 如果保存失败,直接打开临时文件 wx.showModal({ title: '下载成功', content: '是否立即打开?', confirmText: '打开', cancelText: '稍后', success: (modalRes) => { if (modalRes.confirm) { wx.openDocument({ filePath: tempFilePath, fileType: 'pdf', showMenu: true }) } } }) } }) } }, fail: (err) => { wx.hideLoading() console.error('下载失败:', err) wx.showToast({ title: '下载失败', icon: 'none' }) } }) } catch (error) { wx.hideLoading() console.error('下载失败:', error) } }, // 分享获取积分 shareToGetPoints() { wx.showToast({ title: '点击右上角分享给好友', icon: 'none', duration: 2000 }) }, // 保存下载记录 saveDownloadRecord() { try { const downloads = wx.getStorageSync('downloads') || [] const record = { id: this.data.id, title: this.data.detail.title, e_title: this.data.detail.e_title, coverurl: this.data.detail.coverurl, pdfurl: this.data.detail.pdfurl, category_name: this.data.detail.category_name, downloadTime: Date.now(), filePath: this.data.downloadedPath } // 检查是否已存在 const existIndex = downloads.findIndex(d => d.id === record.id) if (existIndex > -1) { downloads[existIndex] = record } else { downloads.unshift(record) } // 最多保存100条 if (downloads.length > 100) { downloads.pop() } wx.setStorageSync('downloads', downloads) } catch (error) { console.error('保存下载记录失败:', error) } }, // 打印PDF printPdf() { const pdfUrl = DATA_BASE_URL + this.data.detail.pdfurl wx.showLoading({ title: '准备打印...', mask: true }) // 先下载PDF wx.downloadFile({ url: pdfUrl, success: (res) => { wx.hideLoading() if (res.statusCode === 200) { // 微信小程序没有直接打印API,引导用户通过打开文档后使用系统打印 wx.openDocument({ filePath: res.tempFilePath, fileType: 'pdf', showMenu: true, success: () => { wx.showToast({ title: '请点击右上角菜单进行打印', icon: 'none', duration: 3000 }) }, fail: (err) => { console.error('打开PDF失败:', err) wx.showToast({ title: '打开失败', icon: 'none' }) } }) } }, fail: (err) => { wx.hideLoading() console.error('下载失败:', err) wx.showToast({ title: '加载失败', icon: 'none' }) } }) }, // 跳转到其他详情 goDetail(e) { const id = e.currentTarget.dataset.id wx.redirectTo({ url: `/pages/detail/detail?id=${id}` }) } }))