Files
YelayMaths/yelaymaths/pages/LoginOrOutDetails/LoginOrOutDetails.js
T
2026-09-30 03:38:10 +08:00

99 lines
3.0 KiB
JavaScript

// 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' });
});
},
});
},
});