|
|
|
import router from "../router/index.js";
|
|
|
|
import { getUrl, post } from "../request/index.js";
|
|
|
|
import jwt_decode from "../lib/jwt-decode/jwt-decode.esm.js";
|
|
|
|
import qs from "../lib/qs/shim.js";
|
|
|
|
import { useAppStore } from "../store/index.js";
|
|
|
|
import { refreshRouter } from "../router/index.js";
|
|
|
|
import Enumerable from "linq";
|
|
|
|
import { connection } from "../signalr/index.js";
|
|
|
|
|
|
|
|
const isLogin = async () => {
|
|
|
|
const appStore = useAppStore();
|
|
|
|
// 有 token,判断是否过期,失败设置 token 为 null
|
|
|
|
if (appStore.token) {
|
|
|
|
const exp = new Date(jwt_decode(appStore.token).exp * 1000);
|
|
|
|
if (exp > new Date()) {
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
appStore.token = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 有 refresh token,获取 token,失败删除 refresh token
|
|
|
|
const refreshToken = getRefreshToken();
|
|
|
|
if (refreshToken) {
|
|
|
|
const url = getUrl("token/refresh");
|
|
|
|
const refreshRespoonse = await fetch(url, {
|
|
|
|
method: "POST",
|
|
|
|
body: qs.stringify({ refreshToken }),
|
|
|
|
headers: {
|
|
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
|
|
},
|
|
|
|
});
|
|
|
|
if (refreshRespoonse.ok) {
|
|
|
|
const refreshResult = await refreshRespoonse.json();
|
|
|
|
// 设置 token 并同时更新 refresh token
|
|
|
|
appStore.token = refreshResult.access_token;
|
|
|
|
setRefreshToken(refreshResult.refresh_token);
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
removeRefreshToken();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
const login = async (action, data) => {
|
|
|
|
const appStore = useAppStore();
|
|
|
|
const result = await post(action, data, null, true);
|
|
|
|
if (!result.errors) {
|
|
|
|
appStore.token = result.data.access_token;
|
|
|
|
setRefreshToken(result.data.refresh_token);
|
|
|
|
appStore.user = await getUser();
|
|
|
|
await refreshRouter();
|
|
|
|
const redirect = router.currentRoute.value.query?.redirect ?? "/";
|
|
|
|
router.push(redirect);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
};
|
|
|
|
|
|
|
|
const logout = () => {
|
|
|
|
const appStore = useAppStore();
|
|
|
|
appStore.token = null;
|
|
|
|
removeRefreshToken();
|
|
|
|
router.push({ path: "/login", query: { redirect: router.currentRoute.value.fullPath } });
|
|
|
|
};
|
|
|
|
|
|
|
|
const getUser = async () => {
|
|
|
|
const result = await post("user/info");
|
|
|
|
const user = result.data;
|
|
|
|
user.roles = Enumerable.from(user.userRoles)
|
|
|
|
.select((o) => o.role)
|
|
|
|
.toArray();
|
|
|
|
user.permissions = Enumerable.from(user.roles)
|
|
|
|
.selectMany((o) => o.rolePermissions)
|
|
|
|
.select((o) => o.permission)
|
|
|
|
.orderBy((o) => o.order)
|
|
|
|
.toArray();
|
|
|
|
return user;
|
|
|
|
};
|
|
|
|
|
|
|
|
const hasPermission = (to) => {
|
|
|
|
const appStore = useAppStore();
|
|
|
|
const permission = to.meta?.permission;
|
|
|
|
if (permission) {
|
|
|
|
const hasPermission = Enumerable.from(appStore.user.permissions).any((o) => o.number === permission);
|
|
|
|
return hasPermission;
|
|
|
|
} else {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const refreshTokenKey = "refresh_token";
|
|
|
|
|
|
|
|
const getRefreshToken = () => localStorage.getItem(refreshTokenKey);
|
|
|
|
|
|
|
|
const setRefreshToken = (refreshToken) => localStorage.setItem(refreshTokenKey, refreshToken);
|
|
|
|
|
|
|
|
const removeRefreshToken = () => {
|
|
|
|
localStorage.removeItem(refreshTokenKey);
|
|
|
|
connection.stop();
|
|
|
|
};
|
|
|
|
|
|
|
|
export { isLogin, login, logout, getUser, hasPermission };
|