mall数据库文件
This commit is contained in:
@@ -624,6 +624,56 @@ export class AkSupa {
|
||||
this.baseUrl = baseUrl;
|
||||
this.apikey = apikey;
|
||||
this.storage = new AkSupaStorageApi(this);
|
||||
// [CHANGE][2026-01-30] hydrate user/session from persisted token (see docs: components/supadb/docs/CHANGELOG.md)
|
||||
try {
|
||||
this.hydrateSessionFromStorage();
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
// [CHANGE][2026-01-30] hydrate user from /auth/v1/user when token exists in storage
|
||||
async hydrateSessionFromStorage() : Promise<boolean> {
|
||||
try {
|
||||
const token = AkReq.getToken();
|
||||
if (token == null || token == '') return false;
|
||||
const res = await AkReq.request({
|
||||
url: this.baseUrl + '/auth/v1/user',
|
||||
method: 'GET',
|
||||
headers: {
|
||||
apikey: this.apikey,
|
||||
Authorization: `Bearer ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
} as UTSJSONObject
|
||||
}, false);
|
||||
const status = res.status ?? 0;
|
||||
if (!(status >= 200 && status < 400)) {
|
||||
return false;
|
||||
}
|
||||
let user: UTSJSONObject | null = null;
|
||||
try {
|
||||
user = new UTSJSONObject(res.data);
|
||||
} catch (e) {
|
||||
user = null;
|
||||
}
|
||||
if (user == null) return false;
|
||||
this.user = user;
|
||||
// 仅补齐最小 session 结构,供 getSession / UI 判断登录态使用
|
||||
if (this.session == null) {
|
||||
this.session = {
|
||||
access_token: token,
|
||||
refresh_token: AkReq.getRefreshToken() ?? '',
|
||||
expires_at: AkReq.getExpiresAt() ?? 0,
|
||||
user: user,
|
||||
token_type: 'bearer',
|
||||
expires_in: 0,
|
||||
raw: user
|
||||
} as any;
|
||||
}
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async resetPassword(email : string) : Promise<boolean> {
|
||||
|
||||
22
components/supadb/docs/CHANGELOG.md
Normal file
22
components/supadb/docs/CHANGELOG.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# SupaDB 文档更新记录
|
||||
|
||||
## 2026-01-30
|
||||
|
||||
### AkSupa:从本地持久化 token 恢复 user/session
|
||||
|
||||
- **文件**:`components/supadb/aksupa.uts`
|
||||
- **位置**:`export class AkSupa` -> `constructor(baseUrl: string, apikey: string)`,以及新增方法 `hydrateSessionFromStorage()`
|
||||
- **定位标记**:在代码中搜索 `// [CHANGE][2026-01-30]`
|
||||
|
||||
#### 修改了什么
|
||||
|
||||
- 在 `AkSupa` 构造时,会尝试基于本地已持久化的 token(由 `AkReq.setToken` 写入 storage)恢复登录态。
|
||||
- 新增 `hydrateSessionFromStorage()`:
|
||||
- 通过 `AkReq.getToken()` 读取本地 access token
|
||||
- 若 token 存在,则请求 `GET {baseUrl}/auth/v1/user`
|
||||
- 将返回的 user 写入 `this.user`
|
||||
- 若 `this.session` 为空,则补齐一个最小 session 对象,使 `getSession()` 在「重启 App / 刷新页面」后仍能正确反映登录状态
|
||||
|
||||
#### 为什么要改
|
||||
|
||||
此前 `AkReq` 会把 token 持久化到本地,但 `AkSupa` 启动时不会自动恢复 `this.user` / `this.session`,导致即使 token 仍有效,`getSession()` 也可能返回 `{ session: null, user: null }`,从而使依赖登录态的页面判断失败。
|
||||
Reference in New Issue
Block a user