// pages/mine/mine.js const { syncTokens, getCloudTokens, showToast, showLoading, hideLoading } = require('../../utils/util'); const config = require('../../utils/config'); const { hasValidTokens, clearAllTokens } = require('../../utils/cloud'); Page({ /** * 页面的初始数据 */ data: { loading: false, uploading: false, clearing: false, isLoggedIn: false, userInfo: null, currentYear: new Date().getFullYear() }, onShow: function() { // 每次显示页面时检查登录状态 const app = getApp(); const isLoggedIn = hasValidTokens(); // 如果未登录,强制重置用户信息 if (!isLoggedIn) { this.setData({ isLoggedIn: false, userInfo: { avatarUrl: '/images/default-avatar.png', nickName: '微信用户' } }); return; } // 如果已登录,优先使用globalData中的用户信息 this.setData({ isLoggedIn: true, userInfo: app.globalData.userInfo || { avatarUrl: '/images/default-avatar.png', nickName: '微信用户' } }); }, /** * 数据备份 */ uploadData: async function() { // 检查登录状态 if (!this.data.isLoggedIn) { showToast('请先登录'); return; } try { const tokens = wx.getStorageSync('tokens') || []; if (!tokens.length) { showToast('未发现本地数据'); return; } // 显示确认对话框 const confirmed = await new Promise(resolve => { wx.showModal({ title: '数据备份', content: '确定备份本地数据到云端?', confirmText: '确定', confirmColor: '#ff9c10', success: res => resolve(res.confirm) }); }); if (!confirmed) return; this.setData({ uploading: true }); showLoading('正在备份...'); // 同步到云端 await syncTokens(tokens); showToast('数据备份成功', 'success'); } catch (error) { console.error('数据备份失败:', error); showToast('数据备份失败,请重试'); } finally { this.setData({ uploading: false }); hideLoading(); } }, /** * 数据恢复 */ restoreData: async function() { // 检查登录状态 if (!this.data.isLoggedIn) { showToast('请先登录'); return; } try { this.setData({ loading: true }); showLoading('正在获取云端数据...'); // 获取云端数据 const cloudTokens = await getCloudTokens(); if (!cloudTokens || !cloudTokens.length) { showToast('未发现备份数据'); return; } // 显示确认对话框 const confirmed = await new Promise(resolve => { wx.showModal({ title: '云端数据恢复', content: `发现${cloudTokens.length}条数据,确定使用云端数据覆盖本地记录?`, confirmColor: '#ff9c10', success: res => resolve(res.confirm) }); }); if (!confirmed) return; // 保存到本地 await wx.setStorageSync('tokens', cloudTokens); showToast('数据恢复成功', 'success'); } catch (error) { // 如果是404错误(云端无数据),不打印错误日志 if (error.statusCode !== 404) { console.error('数据恢复失败:', error); } showToast('数据恢复失败,请重试'); } finally { this.setData({ loading: false }); hideLoading(); } }, /** * 用户授权登录 */ goAuth: async function() { if (this.data.isLoggedIn) return; try { showLoading('登录中...'); const app = getApp(); const userInfo = await app.userLogin(); // 使用hasValidTokens检查完整的登录状态 const isLoggedIn = hasValidTokens(); if (!isLoggedIn) { throw new Error('登录失败:未能获取有效的访问令牌'); } // 检查是否有自定义设置 const customAvatar = wx.getStorageSync('customAvatar'); const customNickName = wx.getStorageSync('customNickName'); // 更新登录状态,优先使用自定义设置 this.setData({ isLoggedIn: true, userInfo: { ...(userInfo || {}), avatarUrl: customAvatar || wx.getStorageSync('userAvatar') || '/images/default-avatar.png', nickName: customNickName || wx.getStorageSync('userNickName') || '微信用户' } }); showToast('登录成功', 'success'); } catch (error) { console.error('登录失败:', error); showToast(error.message || '登录失败,请重试'); } finally { hideLoading(); } }, /** * 处理头像选择 */ onChooseAvatar: async function(e) { const { avatarUrl } = e.detail; try { showLoading('更新头像中...'); // 更新头像 this.setData({ 'userInfo.avatarUrl': avatarUrl }); // 使用异步存储操作 await Promise.all([ wx.setStorage({ key: 'userAvatar', data: avatarUrl }), wx.setStorage({ key: 'customAvatar', data: avatarUrl }) ]); showToast('头像更新成功', 'success'); } catch (error) { console.error('头像更新失败:', error); // 恢复默认头像 this.setData({ 'userInfo.avatarUrl': '/images/default-avatar.png' }); showToast('头像更新失败,请重试'); } finally { hideLoading(); } }, /** * 处理昵称修改 */ onNicknameChange: function(e) { const nickName = e.detail.value; if (!nickName) return; try { // 更新昵称 this.setData({ 'userInfo.nickName': nickName }); // 保存到本地存储 wx.setStorageSync('userNickName', nickName); // 额外保存为自定义昵称 wx.setStorageSync('customNickName', nickName); } catch (error) { console.error('昵称更新失败:', error); showToast('昵称更新失败,请重试'); } }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function() { wx.stopPullDownRefresh(); }, /** * 退出登录 */ onLoad: function() { const app = getApp(); // 监听全局logout事件 app.globalData.eventEmitter.on('logout', this.handleLogout.bind(this)); }, onUnload: function() { const app = getApp(); // 移除事件监听 if (app.globalData.eventEmitter && this.handleLogout) { app.globalData.eventEmitter.off('logout', this.handleLogout); } }, handleLogout: function() { // 重置页面数据 this.setData({ isLoggedIn: false, userInfo: { avatarUrl: '/images/default-avatar.png', nickName: '微信用户' } }); }, /** * 清空云端数据 */ clearCloudData: async function() { // 检查登录状态 if (!this.data.isLoggedIn) { showToast('请先登录'); return; } try { // 显示确认对话框 const confirmed = await new Promise(resolve => { wx.showModal({ title: '清空云端数据', content: '确定清空云端所有备份数据?此操作不可恢复!', confirmText: '确定', confirmColor: '#ff9c10', success: res => resolve(res.confirm) }); }); if (!confirmed) return; this.setData({ clearing: true }); showLoading('正在清空...'); // 调用清空接口 await clearAllTokens(); showToast('云端数据已清空', 'success'); } catch (error) { console.error('清空云端数据失败:', error); showToast(error.message || '清空失败,请重试'); } finally { this.setData({ clearing: false }); hideLoading(); } }, logout: async function() { try { // 显示确认对话框 const confirmed = await new Promise(resolve => { wx.showModal({ title: '退出登录', content: '确定要退出登录吗?', confirmText: '确定', confirmColor: '#ff9c10', success: res => resolve(res.confirm) }); }); if (!confirmed) return; showLoading('正在退出...'); // 调用全局logout方法 const app = getApp(); app.logout(); // 本地UI更新 this.handleLogout(); showToast('已退出登录', 'success'); } catch (error) { console.error('退出登录失败:', error); showToast('退出登录失败,请重试'); } finally { hideLoading(); } }, /** * 转发 */ onShareAppMessage: function() { return { title: '支持云端备份的动态验证码', path: '/pages/index/index', imageUrl: '/images/share.png' }; } });