// pages/LoginOrOutDetails/LoginOrOutDetails.js const api = require('../../utils/api'); const store = require('../../utils/store'); const config = require('../../config/index'); const app = getApp(); /** 未填昵称时自动生成,与旧版行为一致:用户 + 8 位小写字母数字 */ function randomNickname() { const chars = 'abcdefghijklmnopqrstuvwxyz0123456789'; let s = ''; for (let i = 0; i < 8; i++) s += chars[Math.floor(Math.random() * chars.length)]; return '用户' + s; } Page({ data: { userInfo: { avatarUrl: '', nickName: '' }, loginStatue: false, LoginTag: '一键登录', }, onLoad() { app.ready().then(() => this.refresh()); }, onShow() { this.refresh(); }, refresh() { const user = store.getUser(); // 「已登录」看的是用户主动登录过没有(服务端记着这一位),不是有没有 token const registered = !!(user && user.isLogin === 1); this.setData({ loginStatue: registered, LoginTag: registered ? '退出登录' : '一键登录', userInfo: { avatarUrl: config.STATIC_BASE_URL + config.PLACEHOLDER.WECHAT, nickName: registered ? user.nickname : '', }, }); }, /** * 登录 / 注册。 * * 关键:不能凭本地缓存决定昵称。 * 退出登录会清空本地缓存,此时若直接生成随机昵称并提交, * 会把老用户在服务端的真实昵称覆盖掉。正确做法是先取服务端资料: * - 已有昵称 → 老用户,原样保留,不提交任何修改 * - 没有昵称 → 首次注册,生成一个随机昵称 * * activeLogin 负责把数据库里的「已登录」标记置 1——只有用户亲自点这里才会置 1, * 静默登录不碰它。它带鉴权,未登录时会自动完成静默登录,无需手动判断 token。 */ onLoginBtnClick() { wx.showLoading({ title: '请稍候', mask: true }); api .activeLogin() .then(() => api.getMe()) .then((user) => { store.setUser(user); if (user.nickname) return user; return api.updateMe({ nickname: randomNickname() }).then((created) => { store.setUser(created); return created; }); }) .then(() => { wx.hideLoading(); wx.showToast({ title: '成功', icon: 'success', mask: true, duration: 1500 }); setTimeout(() => wx.switchTab({ url: '/pages/wode/wode' }), 1500); }) .catch((err) => { wx.hideLoading(); wx.showToast({ title: (err && err.message) || '登录失败', icon: 'none', mask: true }); }); }, onlogout() { if (!this.data.loginStatue) return; wx.showModal({ title: '提示', content: '确定退出登录吗?', confirmColor: '#ff0000', success: (res) => { if (!res.confirm) return; wx.showLoading({ title: '请稍候', mask: true }); api.logout().then(() => { wx.hideLoading(); wx.switchTab({ url: '/pages/wode/wode' }); }); }, }); }, });