78 lines
1.6 KiB
TypeScript
78 lines
1.6 KiB
TypeScript
import { ref } from "vue";
|
|
import { router, storage, user } from "@/cool";
|
|
|
|
/**
|
|
* 核心认证工具类
|
|
* 严格遵循微信官方登录规范,并保持与 cool 框架同步
|
|
*/
|
|
export const auth = {
|
|
/**
|
|
* 登录状态 (响应式)
|
|
*/
|
|
isLogin: ref(!!uni.getStorageSync("token")),
|
|
|
|
/**
|
|
* 获取本地 Token
|
|
*/
|
|
getToken(): string {
|
|
const token = uni.getStorageSync("token") || "";
|
|
this.isLogin.value = !!token;
|
|
return token;
|
|
},
|
|
|
|
/**
|
|
* 设置登录态 (核心修复:必须同步设置 deadtime 否则会被框架误判为过期)
|
|
*/
|
|
setToken(token: string, userInfo: any) {
|
|
// 1. 设置 Token (30天过期)
|
|
storage.set("token", token, 3600 * 24 * 30);
|
|
|
|
// 2. 设置用户信息
|
|
storage.set("userInfo", userInfo, 0);
|
|
|
|
// 3. 同步内存中的 user store (核心修复:框架内部请求使用的是这个 store)
|
|
user.token = token;
|
|
user.set(userInfo);
|
|
|
|
// 4. 更新响应式状态
|
|
this.isLogin.value = true;
|
|
},
|
|
|
|
/**
|
|
* 校验登录态
|
|
*/
|
|
checkLogin(): boolean {
|
|
return !!this.getToken();
|
|
},
|
|
|
|
/**
|
|
* 退出登录
|
|
*/
|
|
logout() {
|
|
storage.remove("token");
|
|
storage.remove("userInfo");
|
|
user.logout();
|
|
},
|
|
|
|
/**
|
|
* 强制获取登录码 (wx.login)
|
|
*/
|
|
getCode(): Promise<string> {
|
|
return new Promise((resolve, reject) => {
|
|
uni.login({
|
|
provider: "weixin",
|
|
success: (res) => {
|
|
if (res.code) {
|
|
resolve(res.code);
|
|
} else {
|
|
reject(new Error("获取微信登录码失败"));
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
reject(new Error(err.errMsg || "调用微信登录接口失败"));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
};
|