// pages/index/upload.js - 上传照片引导页 const app = getApp() const { hasPhone, bindPhoneByCode, ensureProfileCompleteAndRedirect } = require('../../utils/phoneAuth.js') Page({ data: { sampleImages: [ 'https://karuosiyujzk.oss-cn-shenzhen.aliyuncs.com/mbti/20260312/img_69b22c5b77dd72.66364633.png', 'https://karuosiyujzk.oss-cn-shenzhen.aliyuncs.com/mbti/20260312/img_69b22d71b312f8.14596541.png', 'https://karuosiyujzk.oss-cn-shenzhen.aliyuncs.com/mbti/20260312/img_69b22d78d52b94.76297015.png' ], photos: ['', '', ''], uploadedUrls: [], photoIndex: 0, guideTexts: ['请正对镜头', '请向左转45°', '请向右转45°'], guideText: '请正对镜头', uploading: false, needPhoneAuth: false, aiAnalysisText: '分析' }, onLoad() { const tc = app.globalData.textConfig if (tc && tc.aiAnalysisText) { this.setData({ aiAnalysisText: tc.aiAnalysisText }) } else { app.getRuntimeConfig().then((cfg) => { if (cfg && cfg.textConfig) { app.globalData.textConfig = cfg.textConfig this.setData({ aiAnalysisText: cfg.textConfig.aiAnalysisText || '分析' }) } }).catch(() => {}) } }, onShow() { const audit = !!(app.globalData.reviewMode || app.globalData.maintenanceMode) const faceOff = !!(app.globalData.enterprisePermissions && app.globalData.enterprisePermissions.face === false) if (audit || faceOff) { wx.navigateTo({ url: '/pages/test-select/index' }) return } if (!ensureProfileCompleteAndRedirect()) { return } if (typeof this.getTabBar === 'function' && this.getTabBar()) { const tb = this.getTabBar() if (typeof tb.updateSelected === 'function') tb.updateSelected() } this.setData({ needPhoneAuth: !hasPhone() }) const tc = app.globalData.textConfig if (tc && tc.aiAnalysisText) { this.setData({ aiAnalysisText: tc.aiAnalysisText }) } }, // 本页就地授权手机号 onGetPhoneNumber(e) { const { code, errMsg } = e.detail || {} if (errMsg && errMsg.indexOf('getPhoneNumber:fail') === 0) { wx.showToast({ title: '需要授权手机号才能继续', icon: 'none' }) return } if (!code && !hasPhone()) { wx.showToast({ title: '获取手机号失败', icon: 'none' }) return } if (!code && hasPhone()) { // 已有手机号,无需重复请求 this.setData({ needPhoneAuth: false }) return } bindPhoneByCode(code).then(() => { this.setData({ needPhoneAuth: false }) }).catch(() => { // 失败时保持 needPhoneAuth 为 true,等待用户重新授权 this.setData({ needPhoneAuth: !hasPhone() }) }) }, // 选择/拍摄照片通用方法(index: 0 正面 / 1 左侧 / 2 右侧) choosePhoto(index) { wx.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['camera', 'album'], success: (res) => { const tempPath = res.tempFilePaths[0] const photos = this.data.photos.slice() photos[index] = tempPath const filledCount = photos.filter(Boolean).length const guideText = this.data.guideTexts[filledCount] || '拍摄完成' this.setData({ photos, photoIndex: filledCount, guideText }) // 选完图后立即上传当前这张到服务器 this.uploadSinglePhoto(index, tempPath) }, fail: () => {} }) }, // 单张上传到服务器,成功后记录 URL uploadSinglePhoto(index, localPath) { const apiBase = (app.globalData && app.globalData.apiBase) ? app.globalData.apiBase.replace(/\/$/, '') : '' if (!apiBase) { wx.showToast({ title: '网络未就绪,请稍后再试', icon: 'none' }) return } const token = (app.globalData && app.globalData.token) || wx.getStorageSync('token') || '' const uploadUrl = apiBase + '/api/upload/image' wx.showLoading({ title: '上传中...', mask: true }) wx.uploadFile({ url: uploadUrl, filePath: localPath, name: 'file', header: token ? { Authorization: 'Bearer ' + token } : {}, success: (res) => { try { const data = JSON.parse(res.data) if (data.code === 200 && data.data && data.data.url) { const url = data.data.url const uploadedUrls = this.data.uploadedUrls.slice() uploadedUrls[index] = url const photos = this.data.photos.slice() photos[index] = url this.setData({ uploadedUrls, photos }) } else { wx.showToast({ title: data.message || '上传失败', icon: 'none' }) } } catch (e) { wx.showToast({ title: '解析上传结果失败', icon: 'none' }) } }, fail: (err) => { console.error('[upload] 单张上传失败:', err) wx.showToast({ title: '上传失败,请重试', icon: 'none' }) }, complete: () => { wx.hideLoading() } }) }, // 三个角度对应的上传按钮 onUploadFront() { this.choosePhoto(0) }, onUploadLeft() { this.choosePhoto(1) }, onUploadRight() { this.choosePhoto(2) }, // 重新拍摄全部照片 retakeAll() { wx.showModal({ title: '重新拍摄', content: '确定要重新拍摄所有照片吗?', confirmText: '确定', cancelText: '取消', success: (res) => { if (res.confirm) { this.setData({ photos: ['', '', ''], uploadedUrls: [], photoIndex: 0, guideText: '请正对镜头' }) wx.showToast({ title: '已清空,请重新拍摄', icon: 'success' }) } } }) }, // 完成拍照:先上传 3 张图到服务器,拿到 URL 后再跳转结果页 completeCapture() { if (!hasPhone()) { wx.showToast({ title: '请先授权手机号', icon: 'none' }) this.setData({ needPhoneAuth: true }) return } const urls = (this.data.uploadedUrls || []).filter(Boolean) if (!urls.length) { wx.showToast({ title: '请先上传至少一张照片', icon: 'none' }) return } // 此时 URL 已在选择时上传完成,这里只负责保存和跳转 wx.setStorageSync('aiPhotos', urls) wx.navigateTo({ url: '/pages/index/result' }) }, // 相机错误 onCameraError(e) { console.error('相机错误:', e) wx.showModal({ title: '相机权限', content: '请允许使用相机权限以进行性格分析', confirmText: '去设置', success: (res) => { if (res.confirm) { wx.openSetting() } } }) } })