diff --git a/packageA/pages/myResume/myResume.vue b/packageA/pages/myResume/myResume.vue index 3950683..babf046 100644 --- a/packageA/pages/myResume/myResume.vue +++ b/packageA/pages/myResume/myResume.vue @@ -122,7 +122,7 @@ - + @@ -267,12 +267,202 @@ const handleDeleteItem = async (item, index) => { }; // 简历上传核心逻辑 -const handleResumeUpload = () => {}; +const handleResumeUpload = () => { + // 从缓存获取用户ID(参考首页实现方式) + // 优先从store获取,如果为空则从缓存获取 + const storeUserId = userInfo.value?.userId; + const cachedUserInfo = uni.getStorageSync('userInfo') || {}; + const cachedUserId = cachedUserInfo.userId; + + // 获取用户ID:优先使用store中的userId,如果store中没有,使用缓存中的userId + const userId = storeUserId || cachedUserId; + + if (!userId) { + $api.msg('请先登录'); + return; + } + + // 检查是否正在上传 + if (isUploading.value) { + return; + } + + // 选择文件(微信小程序使用 wx.chooseMessageFile,uni-app 中对应 uni.chooseMessageFile) + uni.chooseMessageFile({ + count: 1, // 只能选择一个文件 + type: 'file', // 选择任意文件类型 + success: (res) => { + // 注意:文件路径在 res.tempFiles[0].path + const file = res.tempFiles[0]; + const tempFilePath = file.path; // 获取临时文件路径 + const fileName = file.name; // 获取文件名 + + // 检查文件大小(20MB = 20 * 1024 * 1024 字节) + const maxSize = 20 * 1024 * 1024; + if (file.size > maxSize) { + $api.msg('文件大小不能超过 20MB'); + return; + } + + // 检查文件类型 + const allowedTypes = ['pdf', 'doc', 'docx']; + const fileExtension = fileName.split('.').pop()?.toLowerCase(); + if (!fileExtension || !allowedTypes.includes(fileExtension)) { + $api.msg('仅支持 PDF、Word 格式'); + return; + } + + // 开始上传 + uploadResumeFile(tempFilePath, fileName, userId); + }, + fail: (err) => { + console.error('选择文件失败:', err); + // 用户取消选择不提示错误 + if (err.errMsg && !err.errMsg.includes('cancel')) { + $api.msg('选择文件失败,请重试'); + } + } + }); +}; + +// 上传简历文件到服务器(使用 wx.uploadFile,uni-app 中对应 uni.uploadFile) +const uploadResumeFile = (filePath, fileName, userId) => { + // 确保 userId 存在且有效 + if (!userId) { + // 如果传入的userId为空,尝试从缓存再次获取 + const cachedUserInfo = uni.getStorageSync('userInfo') || {}; + const cachedUserId = cachedUserInfo.userId; + + if (!cachedUserId) { + $api.msg('用户ID不存在,无法上传'); + return; + } + + // 使用缓存中的userId + userId = cachedUserId; + } + + isUploading.value = true; + + // 获取token(从缓存获取,参考首页实现方式) + let Authorization = ''; + const tokenValue = uni.getStorageSync('token') || ''; + if (tokenValue) { + Authorization = tokenValue; + } else { + // 如果缓存中没有token,尝试从store获取 + const userStore = useUserStore(); + if (userStore.token) { + Authorization = userStore.token; + } + } + + // 根据接口文档,bussinessId 应该作为 Query 参数传递,而不是 formData + // 将 bussinessId 拼接到 URL 上作为查询参数 + const uploadUrl = `${config.baseUrl}/app/file/upload?bussinessId=${encodeURIComponent(String(userId))}`; + + // 打印调试信息 + console.log('上传文件参数:', { + url: uploadUrl, + fileName: fileName, + bussinessId: userId, + userId: userId, + token: Authorization ? '已获取' : '未获取' + }); + + // 上传文件(参考微信小程序 wx.uploadFile API) + uni.uploadFile({ + url: uploadUrl, // 开发者服务器的上传接口(必须是 HTTPS),bussinessId 作为 Query 参数 + filePath: filePath, // 本地文件路径(临时路径) + name: 'file', // 服务器端接收文件的字段名(需与后端一致) + // 注意:根据接口文档,bussinessId 通过 Query 参数传递,不需要 formData + header: { + 'Authorization': encodeURIComponent(Authorization) + }, + success: (uploadRes) => { + try { + // 注意:res.data 是字符串,需转为 JSON(如果后端返回 JSON) + // 参考方案:const result = JSON.parse(data); + let resData; + if (typeof uploadRes.data === 'string') { + resData = JSON.parse(uploadRes.data); + } else { + resData = uploadRes.data; + } + + // 判断上传是否成功 + if (uploadRes.statusCode === 200 && resData.code === 200) { + // 上传成功,处理返回结果 + uploadedResumeName.value = fileName; + uploadedResumeUrl.value = resData.data || resData.msg || resData.url || ''; + $api.msg('简历上传成功'); + console.log('上传成功', resData); + + // 可以在这里保存简历信息到后端(如果需要) + // saveResumeInfo(userId, uploadedResumeUrl.value, fileName); + } else { + // 上传失败 + const errorMsg = resData.msg || resData.message || '上传失败,请重试'; + $api.msg(errorMsg); + console.error('上传失败:', resData); + } + } catch (error) { + // 解析响应数据失败 + console.error('解析上传响应失败:', error); + console.error('原始响应数据:', uploadRes.data); + $api.msg('上传失败,请重试'); + } + }, + fail: (err) => { + // 上传失败 + console.error('上传文件失败:', err); + $api.msg('上传失败,请检查网络连接'); + }, + // 上传进度监听(可选) + progress: (res) => { + const progress = res.progress; // 上传进度(0-100) + console.log('上传进度:', progress + '%'); + // 可以在这里更新进度条 UI(如果需要) + }, + complete: () => { + // 上传完成(无论成功或失败) + isUploading.value = false; + } + }); +}; // 删除已上传的简历 -const handleDeleteResume = () => {}; +const handleDeleteResume = () => { + if (!uploadedResumeName.value) { + return; + } + + uni.showModal({ + title: '确认删除', + content: '确定要删除已上传的简历吗?', + success: (res) => { + if (res.confirm) { + // 清除本地数据 + uploadedResumeName.value = ''; + uploadedResumeUrl.value = ''; + $api.msg('已删除'); + + // 如果需要,可以调用后端接口删除服务器上的文件 + // deleteResumeFile(userId); + } + } + }); +}; + +