mall数据库文件

This commit is contained in:
comlibmb
2026-01-30 16:11:23 +08:00
parent b53d2376ff
commit cfec4a16c0
71 changed files with 11786 additions and 1009 deletions

View File

@@ -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> {

View 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 }`,从而使依赖登录态的页面判断失败。