From 4cf836055a02ed2dfd6fa4fd543366a7c2e06608 Mon Sep 17 00:00:00 2001
From: 疯狂的狮子Li <15040126243@163.com>
Date: 星期日, 02 七月 2023 15:40:13 +0800
Subject: [PATCH] !23 统一登录,授权 Merge pull request !23 from 三个三/auth
---
src/views/login.vue | 17 ++++-
src/layout/components/SocialLogin/index.vue | 82 +++++++++++++++++++++------
src/api/login.ts | 27 ++++-----
src/router/index.ts | 1
src/api/types.ts | 9 ++-
5 files changed, 96 insertions(+), 40 deletions(-)
diff --git a/src/api/login.ts b/src/api/login.ts
index 9903f5b..d4ceb49 100644
--- a/src/api/login.ts
+++ b/src/api/login.ts
@@ -2,6 +2,7 @@
import { AxiosPromise } from 'axios';
import { LoginData, LoginResult, VerifyCodeResult, TenantInfo } from './types';
import { UserInfo } from '@/api/system/user/types';
+import { da } from 'element-plus/es/locale';
/**
* @param data {LoginData}
@@ -9,13 +10,9 @@
*/
export function login(data: LoginData): AxiosPromise<LoginResult> {
const params = {
- tenantId: data.tenantId,
- username: data.username.trim(),
- password: data.password,
- code: data.code,
- uuid: data.uuid,
- clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
- grantType: 'password'
+ ...data,
+ clientId: data.clientId || 'e5cd7e4891bf95d1d19206ce24a7b32e',
+ grantType: data.grantType || 'password'
};
return request({
url: '/auth/login',
@@ -66,16 +63,16 @@
* 绗笁鏂圭櫥褰�
* @param source 绗笁鏂圭櫥褰曠被鍨�
* */
-export function socialLogin(source: string, code: any, state: any): AxiosPromise<any> {
- const data = {
- code,
- state,
- source
+export function callback(data: LoginData): AxiosPromise<any> {
+ const LoginData = {
+ ...data,
+ clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
+ grantType: 'social'
};
return request({
- url: '/auth/social-login',
- method: 'get',
- params: data
+ url: '/auth/social/callback',
+ method: 'post',
+ data: LoginData
});
}
diff --git a/src/api/types.ts b/src/api/types.ts
index 8ca204f..e02e645 100644
--- a/src/api/types.ts
+++ b/src/api/types.ts
@@ -15,10 +15,13 @@
* 鐧诲綍璇锋眰
*/
export interface LoginData {
- tenantId: string;
- username: string;
- password: string;
+ tenantId?: string;
+ username?: string;
+ password?: string;
rememberMe?: boolean;
+ socialCode?: string,
+ socialState?: string,
+ source?: string,
code?: string;
uuid?: string;
clientId: string;
diff --git a/src/layout/components/SocialLogin/index.vue b/src/layout/components/SocialLogin/index.vue
index 127007b..7656673 100644
--- a/src/layout/components/SocialLogin/index.vue
+++ b/src/layout/components/SocialLogin/index.vue
@@ -3,34 +3,80 @@
</template>
<script setup lang="ts">
-import {socialLogin} from '@/api/login';
-import {setToken} from '@/utils/auth';
+import { login, callback } from '@/api/login';
+import { setToken } from '@/utils/auth';
+import Cookies from 'js-cookie';
+import { getToken } from '@/utils/auth';
+import { LoginData } from '@/api/types';
const route = useRoute();
-const router = useRouter();
+const loading = ref(true);
/**
* 鎺ユ敹Route浼犻�掔殑鍙傛暟
* @param {Object} route.query.
*/
-const code = route.query.code;
-const state = route.query.state;
+const code = route.query.code as string;
+const state = route.query.state as string;
const source = route.query.source as string;
-const loading = ref(true);
-await socialLogin(source, code, state)
- .then(async (res) => {
- if (res.code !== 200) {
- ElMessage.error(res.msg);
- location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
- return;
- }
+const tenantId = Cookies.get("tenantId") ? Cookies.get("tenantId") as string : '000000';
+
+
+const processResponse = async (res: any) => {
+ if (res.code !== 200) {
+ throw new Error(res.msg);
+ }
+ setToken(res.data.access_token);
+ ElMessage.success(res.msg);
+ location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
+};
+
+const handleError = (error: any) => {
+ ElMessage.error(error.message);
+ location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
+};
+
+const callbackByCode = async (data: LoginData) => {
+ try {
+ const res = await callback(data);
+ await processResponse(res);
loading.value = false;
- setToken(res.msg);
- ElMessage.success('鐧诲綍鎴愬姛');
- location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
- })
- .catch(() => {
+ } catch (error) {
+ handleError(error);
+ }
+};
+
+const loginByCode = async (data: LoginData) => {
+ try {
+ const res = await login(data);
+ await processResponse(res);
loading.value = false;
+ } catch (error) {
+ handleError(error);
+ }
+};
+
+const init = async () => {
+ const data: LoginData = {
+ socialCode: code,
+ socialState: state,
+ tenantId: tenantId,
+ source: source,
+ clientId: 'e5cd7e4891bf95d1d19206ce24a7b32e',
+ grantType: 'social'
+ };
+
+ if (!getToken()) {
+ await loginByCode(data);
+ } else {
+ await callbackByCode(data);
+ }
+};
+
+onMounted(() => {
+ nextTick(() => {
+ init();
});
+});
</script>
diff --git a/src/router/index.ts b/src/router/index.ts
index 76a81bc..dfd0547 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -181,4 +181,5 @@
}
});
+
export default router;
diff --git a/src/views/login.vue b/src/views/login.vue
index 9becbc3..3234864 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -4,7 +4,8 @@
<h3 class="title">RuoYi-Vue-Plus澶氱鎴风鐞嗙郴缁�</h3>
<el-form-item prop="tenantId" v-if="tenantEnabled">
<el-select v-model="loginForm.tenantId" filterable placeholder="璇烽�夋嫨/杈撳叆鍏徃鍚嶇О" style="width: 100%">
- <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option>
+ <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName"
+ :value="item.tenantId"></el-option>
<template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
</el-select>
</el-form-item>
@@ -14,12 +15,14 @@
</el-input>
</el-form-item>
<el-form-item prop="password">
- <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="瀵嗙爜" @keyup.enter="handleLogin">
+ <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off" placeholder="瀵嗙爜"
+ @keyup.enter="handleLogin">
<template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
</el-input>
</el-form-item>
<el-form-item prop="code" v-if="captchaEnabled">
- <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="楠岃瘉鐮�" style="width: 63%" @keyup.enter="handleLogin">
+ <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="楠岃瘉鐮�" style="width: 63%"
+ @keyup.enter="handleLogin">
<template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
</el-input>
<div class="login-code">
@@ -177,6 +180,12 @@
}
}
}
+
+//妫�娴嬬鎴烽�夋嫨妗嗙殑鍙樺寲
+watch(() => loginForm.value.tenantId, (val: string) => {
+ Cookies.set("tenantId", loginForm.value.tenantId, { expires: 30 })
+});
+
/**
* 绗笁鏂圭櫥褰�
* @param type
@@ -185,7 +194,7 @@
authBinding(type).then((res: any) => {
if (res.code === 200) {
window.location.href = res.msg;
- } else {
+ } else {
ElMessage.error(res.msg);
}
});
--
Gitblit v1.9.3