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