小程序修正

This commit is contained in:
tianmo committed 2026-09-29 20:51:39 +08:00
1 parent 5a92bab835
commit 6ae4c109ce
12 files changed
+232 -62

No files matched your search

+21
View File
@@ -0,0 +1,21 @@
{
"name": "yelaymaths",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "yelaymaths",
"version": "1.0.0",
"dependencies": {
"@vant/weapp": "^1.11.7"
}
},
"node_modules/@vant/weapp": {
"version": "1.11.7",
"resolved": "https://registry.npmjs.org/@vant/weapp/-/weapp-1.11.7.tgz",
"integrity": "sha512-Rwn9BBnb4kHSV4XmvBicwtd42J+amEUfnFDcXJsGNPNX4a9c/DoT6YLsm4X1wB2+sQbdiQsbFBLAvGRBxCkD8g==",
"license": "MIT"
}
}
}
@@ -41,21 +41,37 @@ Page({
});
},
/**
* 登录 / 注册。
*
* 关键:不能凭本地缓存决定昵称。
* 退出登录会清空本地缓存,此时若直接生成随机昵称并提交,
* 会把老用户在服务端的真实昵称覆盖掉。正确做法是先取服务端资料:
* - 已有昵称 → 老用户,原样保留,不提交任何修改
* - 没有昵称 → 首次注册,生成一个随机昵称
*/
onLoginBtnClick() {
const nickname = this.data.userInfo.nickName || randomNickname();
wx.showLoading({ title: '请稍候', mask: true });
// getMe 在未登录时会自动完成静默登录,无需手动判断 token
api
.updateMe({ nickname: nickname })
.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.message || '登录失败', icon: 'none', mask: true });
wx.showToast({ title: (err && err.message) || '登录失败', icon: 'none', mask: true });
});
},
@@ -76,4 +92,3 @@ Page({
});
},
});
+31 -18
View File
@@ -11,8 +11,8 @@
const config = require('../config/index');
const store = require('./store');
/** 进行中的刷新,避免并发 401 触发多次刷新 */
let refreshing = null;
/** 进行中的会话恢复,避免并发 401 触发多次恢复流程 */
let recovering = null;
function staticUrl(path) {
if (!path) return '';
@@ -52,14 +52,14 @@ function rawRequest(options) {
});
}
/** 带鉴权的请求。token 失效时刷新一次并重试。 */
/** 带鉴权的请求。token 失效时自动恢复会话并重试一次。 */
function request(options) {
return rawRequest(options).then(({ statusCode, body }) => {
if (body.code === 0) return body.data;
const needLogin = statusCode === 401 || body.code === 2000 || body.code === 2001;
if (needLogin && options.auth !== false && options.retried !== true) {
return refreshAccessToken()
return recoverSession()
.then(() => request(Object.assign({}, options, { retried: true })))
.catch(() => {
store.reset();
@@ -71,27 +71,41 @@ function request(options) {
});
}
/**
* 恢复会话。两级兜底:
* 1. 用 refreshToken 换新 accessToken(快,不打扰用户)
* 2. refreshToken 也没有或已失效时,重新走一次微信静默登录
*
* 第 2 级是必需的:「退出登录」会清空全部 token,
* 此后任何需要鉴权的操作(例如再次点「登录注册」改昵称)都必须先重新登录,
* 否则必然 401。
*/
function recoverSession() {
if (recovering) return recovering;
recovering = refreshAccessToken()
.catch(() => login())
.finally(() => {
recovering = null;
});
return recovering;
}
function refreshAccessToken() {
if (refreshing) return refreshing;
const refreshToken = store.getRefreshToken();
if (!refreshToken) return Promise.reject({ code: 2000, message: '未登录' });
refreshing = rawRequest({
return rawRequest({
url: '/v1/auth/refresh',
method: 'POST',
data: { refreshToken },
auth: false,
})
.then(({ body }) => {
if (body.code !== 0) throw { code: 2000, message: '登录已过期' };
store.setTokens(body.data.accessToken);
return body.data.accessToken;
})
.finally(() => {
refreshing = null;
});
return refreshing;
}).then(({ body }) => {
if (body.code !== 0) throw { code: 2000, message: '登录已过期' };
store.setTokens(body.data.accessToken);
return body.data.accessToken;
});
}
// ── 登录 ──────────────────────────────────────────────────────────────────
@@ -195,4 +209,3 @@ function requestVirtualPayment(payData) {
}
module.exports = Object.assign(api, { requestVirtualPayment });
+1 -2
View File
@@ -108,9 +108,9 @@ const store = {
reset() {
memory.user = null;
memory.siteConfig = null;
memory.entitlements = [];
store.clearTokens();
// 站点配置与登录态无关,保留;否则退出登录后页面文案会退回默认值
wx.removeStorageSync(config.STORAGE.USER);
wx.removeStorageSync(config.STORAGE.ENTITLEMENTS);
notify();
@@ -118,4 +118,3 @@ const store = {
};
module.exports = store;