diff --git a/src/api/oauth/index.ts b/src/api/oauth/index.ts
index c03333d..c3f003a 100644
--- a/src/api/oauth/index.ts
+++ b/src/api/oauth/index.ts
@@ -15,3 +15,20 @@ export const getUserDevice = (userId: string) => {
}
);
};
+
+/**
+ * 生成客户端id
+ */
+export const generateClientId = () => {
+ return service.Get('/api/client/generate_client_id',
+ {
+ meta: {
+ ignoreToken: true,
+ },
+ cacheFor: {
+ mode: "restore",
+ expire: 1000 * 60 * 60 * 24 * 30 // 30天
+ }
+ }
+ );
+};
diff --git a/src/api/oauth/wechat.ts b/src/api/oauth/wechat.ts
index 1166df9..c372ff1 100644
--- a/src/api/oauth/wechat.ts
+++ b/src/api/oauth/wechat.ts
@@ -1,21 +1,5 @@
import {service} from "@/utils/alova/service.ts";
-/**
- * 生成客户端id
- */
-export const generateClientId = () => {
- return service.Get('/api/oauth/wechat/generate_client_id',
- {
- meta: {
- ignoreToken: true,
- },
- cacheFor: {
- mode: "restore",
- expire: 1000 * 60 * 60 * 24 * 30 // 30天
- }
- }
- );
-};
/**
* 获取临时二维码
* @param clientId
diff --git a/src/api/user/index.ts b/src/api/user/index.ts
index a1853a8..ea63288 100644
--- a/src/api/user/index.ts
+++ b/src/api/user/index.ts
@@ -55,6 +55,7 @@ export const phoneLoginApi = (param: PhoneLogin) => {
return service.Post('/api/user/phone_login', {
phone: param.phone,
captcha: param.captcha,
+ auto_login: param.auto_login
},
{
meta: {
@@ -72,6 +73,7 @@ export const accountLoginApi = (param: AccountLogin) => {
return service.Post('/api/user/login', {
account: param.account,
password: param.password,
+ auto_login: param.auto_login
},
{
meta: {
@@ -99,3 +101,18 @@ export const resetPasswordApi = (param: ResetPassword) => {
}
);
};
+/**
+ * 获取用户权限
+ * @param user_id
+ */
+export const getUserPermissions = (user_id: string) => {
+ return service.Get('/api/auth/permission/get_user_permissions', {
+ params: {
+ user_id: user_id
+ },
+ meta: {
+ ignoreToken: false,
+ }
+ }
+ );
+};
diff --git a/src/locales/language/zh.ts b/src/locales/language/zh.ts
index 935af8a..fdf4648 100644
--- a/src/locales/language/zh.ts
+++ b/src/locales/language/zh.ts
@@ -77,6 +77,6 @@ export default {
authTokenExpired: "认证过期,请重新登录!",
loginExpired: "登录已过期!",
pleaseLogin: "请先登录!",
- loginExpiredDesc: "该账号在其他地方登录,请重新登录!"
+ loginExpiredDesc: "该账号在其他地方登录,请刷新后重新登录!"
}
};
diff --git a/src/router/router.ts b/src/router/router.ts
index 765de7b..79cd366 100644
--- a/src/router/router.ts
+++ b/src/router/router.ts
@@ -28,11 +28,13 @@ const router: Router = createRouter({
router.beforeEach((to, _from, next) => {
start();
const user = useStore().user;
+ const client = useStore().client;
const token: string | undefined = user.user.refreshToken;
const userId: string | undefined = user.user.userId;
+ const clientId: string | undefined = client.getClientId();
// 检查用户是否已登录
- const isLoggedIn: boolean = token !== "" && userId !== "";
+ const isLoggedIn: boolean = token !== "" && userId !== "" && clientId !== "";
if (to.path === '/login' || to.path === '/qrlogin' || to.path === '/resetpass') {
if (isLoggedIn) {
diff --git a/src/utils/alova/service.ts b/src/utils/alova/service.ts
index 638238c..5df6b8d 100644
--- a/src/utils/alova/service.ts
+++ b/src/utils/alova/service.ts
@@ -35,13 +35,13 @@ const {onAuthRequired, onResponseRefreshToken} = createServerTokenAuthentication
} else {
message.error(i18n.global.t('error.loginExpired'));
localStorage.removeItem('user');
- await router.push('/login');
+ router.push('/login').then();
}
} catch (error: any) {
console.error(error);
message.error(i18n.global.t('error.loginExpired'));
localStorage.removeItem('user');
- await router.push('/login');
+ router.push('/login').then();
}
}
}
@@ -68,27 +68,33 @@ export const service = createAlova({
}
const lang = useStore().lang;
method.config.headers['Accept-Language'] = lang.lang || 'zh';
+ const client = useStore().client;
+ method.config.headers['X-Request-Id'] = client.getClientId() || '';
}),
// 响应拦截器
responded: onResponseRefreshToken({
onSuccess: async (response: AxiosResponse, _method: any) => {
if (response.data instanceof Blob) {
return response;
- } else {
- if (response.data.code === 403) {
- notification.error({
- placement: 'topRight',
- message: i18n.global.t('error.loginExpired'),
- description: i18n.global.t('error.loginExpiredDesc'),
- onClose: () => {
- localStorage.removeItem('user');
- router.push('/login');
- }
- });
- } else {
- return response.data;
- }
}
+ const {code} = response.data;
+ if (code === 403) {
+ notification.error({
+ placement: 'topRight',
+ duration: 5,
+ message: i18n.global.t('error.loginExpired'),
+ description: i18n.global.t('error.loginExpiredDesc'),
+ onClose: () => {
+ localStorage.removeItem('user');
+ router.push('/login').then();
+ }
+ });
+
+ throw new Error('Authentication Expired');
+ } else {
+ return response.data;
+ }
+
},
onError:
(error: AxiosError, _method: any) => {
diff --git a/src/utils/errorCode/errorCodeHandler.ts b/src/utils/errorCode/errorCodeHandler.ts
index 7e0cfcd..a41c601 100644
--- a/src/utils/errorCode/errorCodeHandler.ts
+++ b/src/utils/errorCode/errorCodeHandler.ts
@@ -6,6 +6,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.400"),
+ duration: 5,
type: "error",
})
.then();
@@ -14,6 +15,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.401"),
+ duration: 5,
type: "error",
})
.then();
@@ -22,6 +24,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.403"),
+ duration: 5,
type: "error",
})
.then();
@@ -30,6 +33,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.404"),
+ duration: 5,
type: "error",
})
.then();
@@ -38,6 +42,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.408"),
+ duration: 5,
type: "error",
})
.then();
@@ -46,6 +51,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.500"),
+ duration: 5,
type: "error",
})
.then();
@@ -54,6 +60,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.501"),
+ duration: 5,
type: "error",
})
.then();
@@ -62,6 +69,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.502"),
+ duration: 5,
type: "error",
})
.then();
@@ -70,6 +78,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.503"),
+ duration: 5,
type: "error",
})
.then();
@@ -78,6 +87,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.504"),
+ duration: 5,
type: "error",
})
.then();
@@ -86,6 +96,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.505"),
+ duration: 5,
type: "error",
})
.then();
@@ -94,6 +105,7 @@ export function handleCode(code: number): void {
message
.open({
content: i18n.global.t("error.other") + `(${code})`,
+ duration: 5,
type: "error",
})
.then();
diff --git a/src/views/Login/LoginFooter.vue b/src/views/Login/LoginFooter.vue
index 5bdfea8..4a2f210 100644
--- a/src/views/Login/LoginFooter.vue
+++ b/src/views/Login/LoginFooter.vue
@@ -27,10 +27,9 @@ import {getGiteeUrl} from "@/api/oauth/gitee.ts";
import useStore from "@/store";
import {message} from "ant-design-vue";
import gitee from "@/assets/svgs/gitee.svg";
-import {generateClientId} from "@/api/oauth/wechat.ts";
import {getQQUrl} from "@/api/oauth/qq.ts";
import {useDebounceFn} from "@vueuse/core";
-import {getUserDevice} from "@/api/oauth";
+import {generateClientId, getUserDevice} from "@/api/oauth";
const router = useRouter();
const {t} = useI18n();
diff --git a/src/views/Login/LoginPage.vue b/src/views/Login/LoginPage.vue
index 5de69df..b52d029 100644
--- a/src/views/Login/LoginPage.vue
+++ b/src/views/Login/LoginPage.vue
@@ -333,7 +333,7 @@ async function sendCaptcha() {
/**
* 账号登录 防抖
*/
-const accountLoginSubmitDebounce = useDebounceFn(accountLoginSubmit, 3000);
+const accountLoginSubmitDebounce = useDebounceFn(accountLoginSubmit, 1000);
/**
* 账号登录提交
@@ -354,7 +354,7 @@ async function accountLoginSubmit() {
/**
* 手机登录提交 防抖
*/
-const phoneLoginSubmitDebounce = useDebounceFn(phoneLoginSubmit, 3000);
+const phoneLoginSubmitDebounce = useDebounceFn(phoneLoginSubmit, 1000);
/**
* 手机登录提交
diff --git a/src/views/Main/MainPage.vue b/src/views/Main/MainPage.vue
index 47a9c3c..1cc06f3 100644
--- a/src/views/Main/MainPage.vue
+++ b/src/views/Main/MainPage.vue
@@ -1,19 +1,23 @@
Welcome to Main Page
-
+
获取登录用户角色
+ {{ data }}