From ec6b0a9c9f2e196892bdb098ae49c69dcaf79287 Mon Sep 17 00:00:00 2001 From: landaiqing <3517283258@qq.com> Date: Wed, 4 Sep 2024 19:00:21 +0800 Subject: [PATCH] :bug: add interface access permissions --- src/api/oauth/index.ts | 17 +++++++++++ src/api/oauth/wechat.ts | 16 ----------- src/api/user/index.ts | 17 +++++++++++ src/locales/language/zh.ts | 2 +- src/router/router.ts | 4 ++- src/utils/alova/service.ts | 38 ++++++++++++++----------- src/utils/errorCode/errorCodeHandler.ts | 12 ++++++++ src/views/Login/LoginFooter.vue | 3 +- src/views/Login/LoginPage.vue | 4 +-- src/views/Main/MainPage.vue | 24 +++++++++------- src/views/QRLogin/QRLogin.vue | 8 +++--- src/views/QRLogin/QRLoginFooter.vue | 3 +- 12 files changed, 94 insertions(+), 54 deletions(-) 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 @@