hookehuyr

fix(material): 修复文件打开错误处理和用户反馈引导

- 修复 showModal cancelText 参数为 undefined 导致的错误
- 优化 PDF 文档打开失败的提示文案和交互
- 新增"去反馈"按钮跳转到意见反馈页面
- 启用 PDF 文档的复制链接功能

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
...@@ -4,6 +4,26 @@ ...@@ -4,6 +4,26 @@
4 > 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/), 4 > 格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),
5 5
6 --- 6 ---
7 +## [2026-02-11] - 修复文件打开错误处理和优化用户反馈
8 +
9 +### 修复
10 +- **showModal 参数错误修复**
11 + - 修复 `useFileOperation.js``showModal``cancelText` 参数为 `undefined` 导致的错误
12 + - 修改逻辑:只在 `showCopyButton``true` 时才添加 `cancelText``showCancel` 参数
13 + - 避免微信小程序报错 "parameter.cancelText should be String instead of Undefined"
14 +
15 +- **PDF 文档打开失败提示优化**
16 + - 将提示文案从"文件可能已损坏,请联系管理员"改为引导用户自主解决问题
17 + - 新增文案:"您可以复制链接在其他应用中打开,或前往'意见反馈'告诉我们"
18 + - 启用 PDF 文档的复制链接功能(与 Office 文档保持一致)
19 +
20 +- **统一错误处理交互**
21 + - 所有文件打开失败场景统一显示"去反馈"取消按钮
22 + - 点击"去反馈"跳转到意见反馈页面 `/pages/feedback/index`
23 + - 点击"复制链接"复制文件下载链接到剪贴板
24 +
25 +---
26 +
7 ## [2026-02-11] - 修复计划书提交逻辑和成功验证 27 ## [2026-02-11] - 修复计划书提交逻辑和成功验证
8 28
9 ### 修复 29 ### 修复
......
...@@ -109,7 +109,8 @@ export function useFileOperation() { ...@@ -109,7 +109,8 @@ export function useFileOperation() {
109 showCopyButton = true 109 showCopyButton = true
110 } else if (['pdf'].includes(fileExt)) { 110 } else if (['pdf'].includes(fileExt)) {
111 message = 'PDF 文件打开失败' 111 message = 'PDF 文件打开失败'
112 - suggestion = '\n\n文件可能已损坏,请联系管理员' 112 + suggestion = '\n\n您可以复制链接在其他应用中打开,或前往"意见反馈"告诉我们'
113 + showCopyButton = !!item.downloadUrl
113 } else { 114 } else {
114 message = `暂不支持预览 ${fileExt.toUpperCase()} 格式文件` 115 message = `暂不支持预览 ${fileExt.toUpperCase()} 格式文件`
115 suggestion = '\n\n请在电脑或其他应用中打开' 116 suggestion = '\n\n请在电脑或其他应用中打开'
...@@ -120,42 +121,48 @@ export function useFileOperation() { ...@@ -120,42 +121,48 @@ export function useFileOperation() {
120 const modalParams = { 121 const modalParams = {
121 title: '提示', 122 title: '提示',
122 content: message + suggestion, 123 content: message + suggestion,
123 - confirmText: showCopyButton ? '复制链接' : '我知道了' 124 + confirmText: showCopyButton ? '复制链接' : '我知道了',
124 - } 125 + cancelText: '去反馈',
125 - 126 + showCancel: true
126 - // 只在有下载链接时才显示取消按钮
127 - if (showCopyButton) {
128 - modalParams.cancelText = '关闭'
129 - modalParams.showCancel = true
130 } 127 }
131 128
132 showModal({ 129 showModal({
133 ...modalParams, 130 ...modalParams,
134 success: (modalRes) => { 131 success: (modalRes) => {
135 - console.log('[文件操作] 用户选择:', modalRes.confirm ? '复制链接' : '关闭') 132 + console.log('[文件操作] 用户选择:', modalRes.confirm ? '复制链接' : '去反馈')
136 - 133 +
137 - if (modalRes.confirm && showCopyButton && item.downloadUrl) { 134 + if (modalRes.confirm) {
138 - // 复制下载链接到剪贴板 135 + // 点击主按钮:复制链接(如果有 downloadUrl)
139 - console.log('[文件操作] 开始复制链接:', item.downloadUrl) 136 + if (showCopyButton && item.downloadUrl) {
140 - 137 + // 复制下载链接到剪贴板
141 - Taro.setClipboardData({ 138 + console.log('[文件操作] 开始复制链接:', item.downloadUrl)
142 - data: item.downloadUrl, 139 +
143 - success: () => { 140 + Taro.setClipboardData({
144 - console.log('[文件操作] ✅ 链接复制成功') 141 + data: item.downloadUrl,
145 - showToast({ 142 + success: () => {
146 - title: '链接已复制', 143 + console.log('[文件操作] ✅ 链接复制成功')
147 - icon: 'success', 144 + showToast({
148 - duration: 2000 145 + title: '链接已复制',
149 - }) 146 + icon: 'success',
150 - }, 147 + duration: 2000
151 - fail: (clipboardErr) => { 148 + })
152 - console.log('[文件操作] ❌ 链接复制失败:', clipboardErr) 149 + },
153 - showToast({ 150 + fail: (clipboardErr) => {
154 - title: '复制失败', 151 + console.log('[文件操作] ❌ 链接复制失败:', clipboardErr)
155 - icon: 'none', 152 + showToast({
156 - duration: 2000 153 + title: '复制失败',
157 - }) 154 + icon: 'none',
158 - } 155 + duration: 2000
156 + })
157 + }
158 + })
159 + }
160 + // 如果没有 downloadUrl,点击"我知道了"不做任何事
161 + } else {
162 + // 点击取消按钮:跳转到意见反馈页面
163 + console.log('[文件操作] 跳转到意见反馈页面')
164 + Taro.navigateTo({
165 + url: '/pages/feedback/index'
159 }) 166 })
160 } 167 }
161 } 168 }
......